将 BufferedOutputStream 转换为 Jersey REST 响应的 InputStream

Convert BufferedOutputStream to InputStream for Jersey REST response

在我的 getfile() REST 方法中,我有一个 BufferedOutputStream 正在 restDAO.readData() 调用中填充数据。此代码之前在响应中传递了一个文件中的字节数组,但由于内存限制,我们正在尝试实现流式处理。据我所知,Response.ok() 方法需要 return 实现 InputStream.

很遗憾,我无法更改 readData 方法,而且我无法使用 easyStream API.

获取 BufferedOutputStream 中的数据并使用适当的流技术将其放入 InputStream 的最佳方法是什么? (不转换为字节数组)

@GET
public Response getFile(@Context javax.ws.rs.core.HttpHeaders headers) throws Exception{
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);

    // Stream is filled with data in this method.
    restDAO.readData(bufferedOutputStream);

    // How do I take data from bufferedOutputStream and put it into inputStream?
    // InputStream inputStream = ?

    return Response.ok(inputStream, mimeType).header("filename", getFileName()).build();
}

最简单的方法是return一个StreamingOutput对象:

Object body = new StreamingOutput() {
    @Override
    public void write(OutputStream out)
    throws IOException {
        final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);

        // Stream is filled with data in this method.
        restDAO.readData(bufferedOutputStream);
    }
};

return Response.ok(body, mimeType).header("filename", getFileName()).build();