如何关闭输入 Response(jax.rs) 的 InputStream

How to close InputStream which fed into Response(jax.rs)

@GET
@Path("/{id}/content")
@Produces({ "application/octet-stream" })
public Response getDocumentContentById(@PathParam("id") String docId) {

    InputStream is = getDocumentStream(); // some method which gives stream
    ResponseBuilder responseBuilder = Response.ok(is);
    responseBuilder.header("Content-Disposition", "attachment; filename=" + fileName);
    return responseBuilder.build();

}

这里如何关闭InputStream呢?如果某些东西(jax.rs)自动关闭。请给我一些信息。谢谢。

当你想要流式传输自定义响应时,我发现最可靠的方法是 return 一个包含 InputStream 的对象(或者可以在某些其他方式),并定义一个 MessageBodyWriter 提供商,它将在正确的时间进行实际的流式传输。

例如,this code 是 Apache Taverna 的一部分,它会流回目录的压缩内容。要使用它,主要代码需要做的就是将 return 和 ZipStream 作为响应(可以打包成 Response 或不打包)并确保它正在处理returning application/zip 内容类型。最后需要注意的一点是,由于这是和CXF打交道,所以需要手动注册provider;与 Glassfish 不同,它们不会自动拾取。这在复杂的场景中是一件好事,但这确实意味着您需要进行注册。