将 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();
在我的 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();