我想大致监视文件上传的进度。我知道我可以重写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以便高效并计算所有发送的字节呢?
很抱歉,如果这是漫长的,我已万一有人维基可以说明问题比一
http://www.karlin.mff.cuni.cz/network/prirucky/javatut/java/io/writingFiltered.html – Val 2013-09-18 13:09:29