2010-07-02 52 views
0

我想大致监视文件上传的进度。我知道我可以重写MultipartEntity并将writeTo(OutputStream out)方法写入到我创建的FilterOutputStream类中以包装默认的InputStream。有关我如何做的完整细节,请参阅我的回答here如何正确扩展Java FilterOutputStream类?

但是,仔细检查后,这会计算每个发送两次的字节!我去了文档,看看发生了什么。看起来FilterOutputStream的write(byte[], int, int)方法只是在一个循环中调用FilterOutputStream的write(byte)方法。它建议子类提供更有效的方法。我会假设这涉及调用底层OutputStream的写(byte [],int,int),并希望底层OutputStream有一个更好的方法将字节推送到流上(Doc的推荐子类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)。然后,我知道这将简单地循环写入(字节)方法,一次写入一个字节。然后,我可以计算写入(字节)方法内写入的所有字节。但是,这是低效的,文档直接建议不要。我确信OutputStream的一些子类可以一次写入多个字节到流中,所以使用这个优点是愚蠢的。

那么,我该如何正确地重写FilterOutputStream以便高效并计算所有发送的字节呢?

很抱歉,如果这是漫长的,我已万一有人维基可以说明问题比一

+0

http://www.karlin.mff.cuni.cz/network/prirucky/javatut/java/io/writingFiltered.html – Val 2013-09-18 13:09:29

回答

3

就叫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)中传输的字节。
+0

Colin,非常感谢!这使得它更清晰:) – Hamy 2010-07-03 20:16:37