因此,我正在将文件数据提供给一个使用 Reader
的API,并且我希望有一种报告进度的方法。
似乎编写一个FilterInputStream
实现来包装FileInputStream
、跟踪已读取的字节数与总文件大小之间的差异并触发一些事件(或调用某个update()
方法)来报告分数进度应该很简单。
(或者,它可以报告绝对已读取的字节数,其他人可以做数学计算——在其他流媒体情况下可能更加普遍有用。)
我知道我以前见过这个,甚至可能以前做过这个,但是我找不到这个代码,而且我懒得再写一遍。有人手头有这个吗?或者有人可以建议更好的方法吗?
一年多(和一点点)后...
我基于下面Adamski的答案实现了一个解决方案,并且它有效,但经过几个月的使用后,我不建议使用它。当你有很多更新时,触发/处理不必要的进度事件成为巨大的代价。基本计数机制很好,但最好让关心进度的人轮询,而不是推送给他们。
(如果您知道总大小,则可以尝试仅在每个> 1%的更改时触发事件或其他内容,但这并不值得麻烦。而且通常情况下,你不知道总大小。)
skip()
。 :) - David Molessuper.read()
是否返回负数(即数据结束)。 - PhoneixSread(byte[]b)
的实现应该只是return read(b, 0, b.length);
(不需要进度更新)。在当前的实现中,调用read(byte[]b)
会导致读取的字节数被计算两次,因为FilterInputStream#read(byte[]b)
的实现直接调用了read(byte[]b,int off,int len)
。 - Marco13