Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 逐渐填充InputStream并使用SpringMVC返回它_Java_Spring_Spring Mvc_Jdbc_Inputstream - Fatal编程技术网

Java 逐渐填充InputStream并使用SpringMVC返回它

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

考虑到数据库中有大量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);
}
但是,在将数据传递到流之前,我必须将整个数据加载到内存中,这显然是没有效率的

所以我需要以某种方式对其进行缓冲,以便使用自定义读取器通过分页读取数据,并将缓冲区发送到客户端。我想实现我自己的
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
    };
}