gpt4 book ai didi

java - 逐渐填充InputStream并用SpringMVC返回

转载 作者:行者123 更新时间:2023-12-01 10:07:05 25 4
gpt4 key购买 nike

考虑到我在数据库中有大量的 csv 字符串,我需要根据客户的请求将它们传递给客户。

一种简单的方法:

@RequestMapping(value = "/{user}/ejournal", method = RequestMethod.GET, produces = "text/csv")
public ResponseEntity<ByteArrayResource> getEJournal(@PathVariable Long userId) {
final byte[] documentBody = EJournal
.findByUser(userId)
.stream()
.collect(Collectors.joining("\n"))
.getBytes();
return new ResponseEntity(
new ByteArrayResource(documentBody),
HttpStatus.OK);
}

从客户端来看,它很简单(kotlin 代码示例):

val inputStream = eJournalService.getJournal(userId)
inputStream.reader().forEachLine { line -> ... }

但是我被迫将整个数据加载到内存中,然后再将其传递给流,显然这效率不高。

所以我需要以某种方式对其进行缓冲,以使用自定义读取器分页读取数据并将缓冲区发送到客户端。我想实现我自己的 InputStreamInputStream#read() 返回 int 而不是 String 并且它是一个有点复杂。

有什么最佳实践可以做到这一点吗?我尝试搜索,但只有使用内存中已存在的流传递图片的示例,而不是在批量发送后使用顺序数据库查询的缓冲分页。

提前致谢。

最佳答案

来自the documentation

The following are the supported return types:

[...]

  • void if the method handles the response itself (by writing the response content directly, declaring an argument of type ServletResponse / HttpServletResponse for that purpose)

[...]

  • A StreamingResponseBody can be returned to write to the response OutputStream asynchronously; also supported as the body within a ResponseEntity.

所以你可以这样做

public StreamingResponseBody getEJournal(@PathVariable Long userId) {
return outputStream -> {
// write your lines to the outputStream here
};
}

您还可以通过将 HttpServletResponse 作为方法的参数来同步写入流,然后写入其输出流。

关于java - 逐渐填充InputStream并用SpringMVC返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36371303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com