Also füttere ich Dateidaten zu einer API, die eine Reader
nimmt, und ich möchte eine Möglichkeit, den Fortschritt zu melden.InputStream oder Reader Wrapper für die Fortschrittsberichterstattung
Es scheint, wie es einfach sein sollte, eine FilterInputStream
Implementierung zu schreiben, die die FileInputStream
Wraps, verfolgt die Anzahl von Bytes gegenüber der Gesamtgröße der Datei gelesen, und feuert ein Ereignis (oder ruft einige update()
-Methode) zu melden fraktioneller Fortschritt.
(Alternativ könnten sie berichten absolute Bytes zu lesen, und jemand anderes die Mathematik tun könnte -. Vielleicht ganz allgemein nützlich im Fall von anderen Streaming-Situationen)
Ich weiß, ich habe dies vor, und ich gesehen Vielleicht habe ich es schon einmal gemacht, aber ich kann den Code nicht finden und bin faul. Hat es jemand herumliegen? Oder kann jemand einen besseren Ansatz vorschlagen?
Ein Jahr (und ein bisschen) später ...
implementiert ich eine Lösung basierend auf Adamskis Antwort unten, und es funktionierte, aber nach einigen Monaten der Nutzung Ich würde es nicht empfehlen . Wenn Sie viele Updates haben, wird das Abfeuern/Behandeln unnötiger Fortschrittsereignisse zu hohen Kosten. Der grundlegende Zählmechanismus ist in Ordnung, aber viel besser, wer sich um die Fortschrittsumfrage kümmert, anstatt ihn ihnen zu übergeben.
(Wenn Sie die Gesamtgröße kennen, können Sie versuchen, nur ein Ereignis feuern jede> 1% Veränderung oder was auch immer, aber es ist nicht wirklich die Mühe wert. Und oft nicht.)
Nicht schlecht. Wahrscheinlich hätte ich 'skip()' vergessen. :) –
@David: Um ehrlich zu sein, das Implementieren von Überspringen bedeutete, böse (int) Umwandlungen einzuführen, wenn Sie also wissen, dass Sie es nicht brauchen, würde ich auch hier eine UnsupportedOperationException werfen. – Adamski
Sie müssen auch überprüfen, dass 'super.read()' kein negatives Ergebnis liefert (Ende der Daten). – PhoneixS