我正在通过各种方法写入输出流。在我关闭它之前,我怎样才能找出输出流的内容长度?
问问题
20244 次
3 回答
18
最简单的方法可能是将其包装在另一个OutputStream
实现中,该实现转发所有写请求,但保留一个内部计数器。然后,您只需写信即可。实施起来应该不会太难——实际上可能已经有了。
编辑:只是猜测一个合理的名称 ( ) 在Apache Commons IOCountingOutputStream
中提出了一个实现。
编辑:如其他地方所述,如果这是用于 HTTP 并且您的客户端尚未缓冲完整数据(在这种情况下,我认为它可以计算出内容长度),您可能会因为需要而遇到问题在写入数据之前写入长度。在某些情况下,您可能会发现它会达到一定的大小(客户端缓冲)然后失败。在这种情况下,大卫的解决方案将是合适的。
于 2009-11-18T14:37:29.743 回答
9
问题是您必须在开始将任何数据写入输出流之前在响应标头中设置内容长度。所以你的选择是:
- 使用 ByteOutputStream 将数据写入 byte[] 数组,然后在获得数据大小后将其复制到响应输出流。但是,如果您正在编写大文件,这显然不是一个选择。
- 将数据写入临时文件,然后在获得文件大小后将其复制到响应输出。根据您正在执行的操作,这可能会导致无法接受的性能损失。
- 根据首先生成数据的成本,您可以生成一次,然后将其丢弃以获取计数,然后再次生成。猜测这不太可能是一个现实的解决方案。
- 接受这样一个事实,即您将无法在响应标头中报告内容长度。
于 2009-11-18T15:26:08.567 回答
2
您可以考虑写入自己的 ByteArrayOutputStream 并在最后将其刷新到响应输出流。
于 2009-11-18T14:36:51.973 回答