【问题标题】:How to properly extend Java FilterOutputStream class?如何正确扩展 Java FilterOutputStream 类?
【发布时间】:2010-07-02 03:48:04
【问题描述】:

我想大致监控文件上传的进度。我知道我可以覆盖 MultipartEntity 并使 writeTo(OutputStream out) 方法写入我为包装默认 InputStream 而创建的 FilterOutputStream 类。有关我如何做到这一点的详细信息,请参阅我的回答 here

但是,经过仔细检查,这会将每个字节发送两次!我去文档看看发生了什么。看起来 FilterOutputStream 的 write(byte[], int, int) 方法只是在循环中调用 FilterOutputStream 的 write(byte) 方法。它推荐子类以提供更有效的方法。我假设这涉及调用底层 OutputStream 的 write(byte[], int, int) 并希望底层 OutputStream 具有将字节推送到流上的更好方法(文档推荐的 OutputStream 子类覆盖此方法并做得更​​好而不是简单地循环 OutputStream#write(byte) 方法)。

这是我发现自己陷入困境的地方。我不能保证 MultipartEntity#writeTo(OutputStream) 总是会导致调用 OutputStream.write(byte[],int,int),所以如果我计算那里发送的字节数,那么我可能会错过一些使用发送的字节数写(字节)方法。但是,我不能算入 write(byte) 方法,因为 OutputStream.write(byte[],int,int) 方法可能永远不会调用 write(byte) 方法。

一个答案是在我的子类的 write(byte[],int,int) 方法中调用 super.write(byte[],int,int) 。然后,我知道这将简单地循环 write(byte) 方法,一次写入一个字节。然后我可以计算在 write(byte) 方法中写入的所有字节。但是,这是低效的,文档直接建议不要这样做。我确信 OutputStream 的一些子类设法一次将多个字节写入流,所以不利用这个优势是愚蠢的。

那么,如何正确覆盖 FilterOutputStream 以既高效又计算所有发送的字节数?

对不起,如果这太长了,我把它做成了一个维基,以防有人能比我更好地描述这个问题。

【问题讨论】:

标签: java overriding subclass subclassing outputstream


【解决方案1】:

当在计数流上调用相同的方法时,只需在底层流上调用 write(byte[] b, int off, int len)。这绝不会导致调用计数流上的write(byte b) 方法。

此外,您在链接答案中的CountingOutputStream 还有许多其他问题。

  1. 即使FilterOutputStream 为您将其存储在名为out 的受保护字段中,它也有自己对包装输出流的引用。
  2. 当调用write(byte[] b, int off, int len) 时,它会将len 字节写入包装的流,但只会将传输的字节数加1。
  3. 它不会增加write(byte b) 中传输的字节数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多