Opakowanie InputStream lub Reader do raportowania postępu

Dostarczam więc dane pliku do interfejsu API, który pobiera daneReaderi chciałbym zgłosić postęp.

Wydaje się, że powinno być proste napisanieFilterInputStream implementacja, która otaczaFileInputStream, śledzi liczbę odczytanych bajtów a całkowity rozmiar pliku i wywołuje jakieś zdarzenie (lub wywołuje niektóre)update() metoda) do zgłaszania ułamkowego postępu.

(Alternatywnie, może zgłosić odczyt bajtów bezwzględnych, a ktoś inny może wykonać matematykę - może bardziej ogólnie przydatne w przypadku innych sytuacji przesyłania strumieniowego.)

Wiem, że widziałem to już wcześniej i może nawet zrobiłem to już wcześniej, ale nie mogę znaleźć kodu i jestem leniwy. Czy ktoś to kręcił? Czy może ktoś zaproponuje lepsze podejście?

Rok (i trochę) później ...

Zaimplementowałem rozwiązanie oparte na odpowiedzi Adamskiego poniżej i zadziałało, ale po kilku miesiącach użytkowania nie poleciłbym go. Gdy masz dużo aktualizacji, odpalanie / obsługa niepotrzebnych zdarzeń postępu staje się ogromnym kosztem. Podstawowy mechanizm zliczania jest w porządku, ale o wiele lepiej jest, aby ktokolwiek troszczył się o ankietę postępu, zamiast go do niego popychać.

(Jeśli znasz całkowity rozmiar, możesz spróbować wystrzelić tylko zdarzenie co> 1% zmiany lub cokolwiek innego, ale tak naprawdę nie warto tego robić. I często nie.)

questionAnswers(5)

yourAnswerToTheQuestion