在Jersey中使用StreamingOutput作为响应实体的示例

78

有人能发布一个在Jersey中如何将StreamingOutput设置为Response对象实体的示例吗?

我一直没有找到这方面的示例。

1个回答

130

看看这是否有帮助:

@GET
@Produces(MediaType.TEXT_PLAIN)
public Response streamExample() {
  StreamingOutput stream = new StreamingOutput() {
    @Override
    public void write(OutputStream os) throws IOException,
    WebApplicationException {
      Writer writer = new BufferedWriter(new OutputStreamWriter(os));
      writer.write("test");
      writer.flush();  // <-- This is very important.  Do not forget.
    }
  };
  return Response.ok(stream).build();
}

31
我刚花了4个小时试图弄清楚为什么我的球衣REST服务无法流式传输文件。 原来是我没有在写入器上使用flush方法。真的很烦人。感谢你的帮助! - Will
2
不幸的是,JAX-RS V 1.1规范和Java EE 6 Javadocs都没有指定给定的输出流是否应该关闭。虽然考虑到前面的评论,我怀疑您确实应该调用OutputStream.close()而不是OutputStream.flush()。这可以释放与输出流关联的一些内部资源。 - Christian Schlichtherle
4
谢谢您的回答,但是在客户端上我该如何获取这个StreamingOutput对象从响应中呢? - koem
1
你如何读取客户端的输出?到处都是服务器端的例子!!!:( - prongs
3
@prongs + Nagyl:是的,我弄清楚了:InputStream is = ClientBuilder.newBuilder().register(MultiPartFeature.class).build().target(BASE_URI).path("/yourservice").request().get().readEntity(InputStream.class); (所有内容都在一个“句子”中,最好将其拆分为客户端、目标和响应对象) - koem
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接