Java 逐渐填充InputStream并使用SpringMVC返回它
考虑到数据库中有大量csv字符串,我需要根据客户机的请求将它们传递给客户机 这是一种天真的方法:Java 逐渐填充InputStream并使用SpringMVC返回它,java,spring,spring-mvc,jdbc,inputstream,Java,Spring,Spring Mvc,Jdbc,Inputstream,考虑到数据库中有大量csv字符串,我需要根据客户机的请求将它们传递给客户机 这是一种天真的方法: @RequestMapping(value = "/{user}/ejournal", method = RequestMethod.GET, produces = "text/csv") public ResponseEntity<ByteArrayResource> getEJournal(@PathVariable Long userId) { final byte[] d
@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);
}
但是,在将数据传递到流之前,我必须将整个数据加载到内存中,这显然是没有效率的
所以我需要以某种方式对其进行缓冲,以便使用自定义读取器通过分页读取数据,并将缓冲区发送到客户端。我想实现我自己的InputStream
,但是InputStream#read()
返回int
,而不是String
,这有点复杂
有没有这样做的最佳实践?我尝试过搜索,但只有一些示例可以使用内存中已经存在的流传递图片,而不是在批发送后使用顺序数据库查询进行缓冲分页
提前感谢。来自
以下是受支持的返回类型:
[……]
- 如果方法处理响应本身,则为void(通过直接写入响应内容,并为此声明ServletResponse/HttpServletResponse类型的参数)
- 可以返回StreamingResponseBody以异步方式写入响应OutputStream;也作为身体在一个响应中被支持
public StreamingResponseBody getEJournal(@PathVariable Long userId) {
return outputStream -> {
// write your lines to the outputStream here
};
}
您还可以通过将
HttpServletResponse
作为方法的参数同步写入流,并写入其输出流。是否可以将StreamingResponseBody
与@Transactional
一起使用?使用它似乎有问题,因为它是异步完成的。好的,我是同步完成的,到目前为止没有问题。
public StreamingResponseBody getEJournal(@PathVariable Long userId) {
return outputStream -> {
// write your lines to the outputStream here
};
}