SpringBoot+WebFlux通过流式响应实现类似ChatGPT的打字机效果

news/2024/10/11 20:26:39

突然间想用Java实现一下像ChatGPT一样的打字机输出效果,但是网上搜了相关教程感觉都不够满意。
这里贴一下自己的实现,为中文互联网做一点小小的贡献

最主要的一点就是响应的Content-Type设置为MediaType.TEXT_EVENT_STREAM_VALUE


实现效果如下

然后贴一下自己的代码吧
思路就是把从文件读取的每一个字符重新合并为一个数组,当然,也可以替换成从其他地方获得的字符
通过fromArray()方法将包装好的字符数组一个个按顺序返回,通过delayElements()指定一个延迟时间,从而实现类似ChatGPT的打字机效果

我这里是从resources/static/test.txt读取文件,通过转换后得到Character[]数组,一定要是包装类数组,基本数据类型不行。

感觉代码不够优雅,转换个字符竟然这么麻烦,希望能有大佬指点。

import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;import java.io.IOException;
import java.time.Duration;/*** @author Juyss* @version 1.0* @description: TODO* @date 2024/6/11 20:52*/
@RestController
@RequestMapping("/chat")
public class ChatController {@GetMapping(value = "/webflux",produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<Character> chatWebFlux(@RequestParam int delay) throws IOException {//读取文件作为字符串数组数据来源DefaultResourceLoader resourceLoader = new DefaultResourceLoader();Resource resource = resourceLoader.getResource("classpath:static/test.txt");byte[] byteArray = resource.getContentAsByteArray();String s = new String(byteArray);char[] charArray = s.toCharArray();//将基本数据类型的字符数组包装为引用数据类型Character[] characters = String.valueOf(charArray).chars().mapToObj(b -> (char) b).toArray(Character[]::new);//通过fromArray()方法将包装好的字符数组一个个按顺序返回,通过delayElements()指定一个延迟时间,从而实现类似ChatGPT的打字机效果return Flux.fromArray(characters).delayElements(Duration.ofMillis(delay));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/42564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

调整Aplayer的歌词颜色和字体大小显示

该段CSS代码的修改主要是为了增强音乐播放器中歌词的可读性和视觉效果。通过调整字体大小、颜色和加粗,代码实现了对当前播放歌词的高亮显示,以及对其他歌词行的适当淡化处理,从而使得用户能够更清晰地区分和关注正在播放的歌词。同时,通过平滑的过渡效果,增强了用户的视觉…

[Paper Reading] Tesla AI Day for FSD Beta

link FrameworkOccupancy 模型结构比较像ICCV 2023的OccNet的做法,不过还会额外预测Suface以及NeRF state,预测可行驶区别suface的好处是可以辅助Planning&Control给出更加准确的运动速度等信息(比如,上下坡可根据suface坡度做更准确判断)。Lanes Neural Network 比较有…

R语言上市公司经营绩效实证研究 ——因子分析、聚类分析、正态性检验、信度检验|附代码数据

全文链接:http://tecdat.cn/?p=32747 原文出处:拓端数据部落公众号 随着我国经济的快速发展,上市公司的经营绩效成为了一个备受关注的话题。本文旨在探讨上市公司经营绩效的相关因素,并运用数据处理、图示、检验和分析等方法进行深入研究,帮助客户对我国45家上市公司的16…

Go语言goroutine调度器初始化

1、调度器初始化 调用点:src/runtime/asm_amd64.s:349 -> CALL runtimeschedinit(SB) runtime/proc.go : 526func schedinit() { // raceinit must be the first call to race detector. // In particular, it must be done before mallocinit below calls racemapshadow.…

龙哥量化:通达信空信号,可以买入翻倍的指标公式源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889{当多空线上穿0轴以后并且沿着45度向上运行时可视为有效突破,此时的信号可视为有效信号。信号出现在平台盘整期间,或者是小多头回调之后向上拉升之际,此时的信号最为有效,其它时间的信号要仔细辨别…

龙哥量化:通达信筹码操盘,筹码来的副图源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889 DRAWGBK(ISLASTBAR, RGB(60,60,60),RGB(0,0,0),0,0,0); 机构控盘区:160,COLORMAGENTA ,LINETHICK1; DRAWTEXT(ISLASTBAR, 机构控盘区,-- ←机构控盘区),COLORMAGENTA ; 主升浪:150,COLORRED ,LINETHIC…

私有化部署bitwarden密码管理器(一)——环境准备

碎碎念 现在各种网站和手机APP都要求设置密码和输入密码,每个人都要设置大量的密码。如果都设为统一密码,就存在一旦一个密码被攻破,其他密码都失效的情况。如果要分别设置为不同密码,那么记住密码又成了一个困难的问题。所以密码管理工具也就应运而生,比较有名的密码管理…

私有化部署bitwarden密码管理器(三)——nginx方式部署

仅有IP无证书的环境部署bitwarden密码管理器 虽然使用npm方式部署比较简单,但是很多小伙伴可能没有一台带域名国外vps,接下来介绍仅有IP的Vps,如国内的服务器无域名证书或者是本地无外网的环境如:虚拟机、NAS、树莓派等环境部署bitwarden密码管理器。 部署Nginx Nginx和Nginx…