将BufferedOutputStream转换为用于Jersey REST响应的InputStream

时间:2015-03-24 20:06:48

标签: java rest jersey streaming

在我的getfile() REST方法中,我有一个BufferedOutputStream,其restDAO.readData()来电时正在填充数据。此代码先前在响应中的文件中传递了一个字节数组,但由于内存限制,我们正在尝试实现流式传输。根据我的说法,Response.ok()方法需要返回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();
}

1 个答案:

答案 0 :(得分:1)

最简单的方法是返回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();