【问题标题】:Response outputstream content length?响应输出流内容长度?
【发布时间】:2009-11-18 14:34:43
【问题描述】:

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

【问题讨论】:

    标签: java response outputstream


    【解决方案1】:

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

    编辑:只是猜测一个合理的名称 (CountingOutputStream) 在Apache Commons IO 中实现了。

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

    【讨论】:

    • 你,Apache Commons!我必须开始不要忘记 Apache Commons !!!我会试试的。
    • 它适用于大数据吗?正如大卫指出的那样,您应该在将任何内容写入响应的 outputStream 之前设置“Content-length”标头
    • @AndreyRegentov:这取决于上下文是什么。如果输出正在被您写入的任何内容缓冲,那么您很好。而且我们不一定知道这是 HTTP,尽管这是一个合理的选择。我会用一些想法修改我的答案。
    • @JonSkeet 完全同意上下文。我通过谷歌搜索 HTTP 来到这里,并无意中假设问题是关于 HTTP(响应,内容长度),尽管问题中没有任何内容。
    • @AndreyRegentov:虽然看起来确实很有可能:) 无论如何,已经添加了一点并支持大卫的答案。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 然而,这将非常占用内存,因为 byte[] 的每个字节都会占用 JVM 内存的一个字节。
      猜你喜欢
      • 2020-09-19
      • 2015-04-30
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2013-03-08
      相关资源
      最近更新 更多