Java 响应输出流内容长度?

Java 响应输出流内容长度?,java,response,outputstream,Java,Response,Outputstream,我正在通过各种方法编写输出流。在关闭outputstream之前,我如何确定outputstream的内容长度 > P>您可以考虑编写自己的BytRayOutPutsFrand并将其刷新到响应输出流的末尾。最简单的方法可能是将其封装在另一个 OuttoStult实现中,该实现转发所有写入请求,但保持内部计数器。那你就写下来吧。实施起来应该不会太难——事实上可能已经有了 编辑:仅仅猜测一个合理的名称(CountingOutputStream)就在中得到了一个实现 编辑:如其他地方所述,如果这是针对

我正在通过各种方法编写输出流。在关闭outputstream之前,我如何确定outputstream的内容长度

> P>您可以考虑编写自己的BytRayOutPutsFrand并将其刷新到响应输出流的末尾。

最简单的方法可能是将其封装在另一个<代码> OuttoStult实现中,该实现转发所有写入请求,但保持内部计数器。那你就写下来吧。实施起来应该不会太难——事实上可能已经有了

编辑:仅仅猜测一个合理的名称(
CountingOutputStream
)就在中得到了一个实现


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

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

  • 使用ByteOutputStream将数据写入byte[]数组,并在获得数据大小后将其复制到响应输出流。但是,如果您正在编写大文件,显然这不是一个选项
  • 将数据写入临时文件,然后在获得文件大小后将其复制到响应输出。根据您所做的工作,这可能会造成无法接受的性能损失
  • 根据最初生成数据的成本,您可以生成一次数据,然后将其丢弃以获取计数,然后再次生成。猜测这不太可能是一个现实的解决方案
  • 请接受这样一个事实:您将无法在响应头中报告内容长度

  • 然而,这将非常占用内存,因为byte[]的每个字节都会占用JVM的一个字节的内存!我必须开始不要忘记Apache Commons!!!我会试试。它能在大数据上工作吗?在将任何内容写入响应的outputStream之前,应该设置“Content length”标题,就像David一样noted@AndreyRegentov:这取决于上下文是什么。如果输出被写入的内容缓冲,那么就可以了。我们不一定知道这是HTTP,尽管这是一个合理的赌注。“我将用一些想法修改我的答案。”JonSkeet完全同意上下文。我是通过谷歌搜索HTTP来到这里的,无意中假设问题是关于HTTP(响应,内容长度),尽管问题中没有任何内容。@AndreyRegentov:看起来很有可能:)无论如何,我添加了一点,并对David的答案投了赞成票。