Opakowanie InputStream lub Reader do raportowania postępu
Dostarczam więc dane pliku do interfejsu API, który pobiera daneReader
i 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.)