响应输出流内容长度?

时间:2009-11-18 14:34:44

标签: java response outputstream

我通过各种方法写输出流。在关闭之前,我怎样才能找出输出流的内容长度?

3 个答案:

答案 0 :(得分:16)

最简单的方法可能是将它包装在另一个OutputStream实现中,该实现转发所有写请求,但保留一个内部计数器。然后你只需写信给那。不应该太难实现 - 事实上可能已经有了。

编辑:只需猜测一个合理的名称(CountingOutputStream)就可以在Apache Commons IO中找到一个实现。

编辑:正如其他地方所述,如果这是针对HTTP的,而您的客户端尚未对缓冲完整数据进行缓冲(在这种情况下,我认为可以计算出内容长度),由于在写入数据之前需要写入长度,可能会出现问题。在某些情况下,您可能会发现它将达到一定的大小(客户端缓冲)然后失败。在这种情况下,大卫的解决方案将是合适的。

答案 1 :(得分:8)

问题是在开始将任何数据写入输出流之前,必须在响应头中设置内容长度。所以你的选择是:

  1. 使用ByteOutputStream将数据写入byte []数组,然后在获得数据大小后将其复制到响应输出流。但是,如果您正在编写大文件,这显然不是一种选择。
  2. 将数据写入临时文件,然后在获得文件大小后将其复制到响应输出。根据您正在做的事情,这可能会导致性能损失,这是不可接受的。
  3. 根据首先生成数据的成本,您可以生成一次,然后将其丢弃以获取计数,然后再次生成。猜测这不太可能是一个现实的解决方案。
  4. 请注意,您将无法在响应标头中报告内容长度。

答案 2 :(得分:2)

您可以考虑写入您自己的ByteArrayOutputStream并将其刷新到最后的响应输出流。