Ein generischer InputStream
liefert keine Informationen über die aktuelle Position oder die Gesamtlänge nach außen. Siehe InputStream availiable()
ist nicht die Gesamtgröße der InputStream
und es gibt keine solche Dinge wie aktuelle Position erhalten oder Gesamtgröße erhalten. Sie könnten auch nur Chunks/Teile des Streams lesen, sogar der Fortschrittsbalken wäre in der Lage, die Gesamtlänge des Streams herauszufinden, von dem Sie nicht wissen, dass Sie nur 512 Bytes lesen werden.
Die ProcessMonitorInputStream
dekoriert die bereitgestellten InputStream
und aktualisiert die Fortschrittsanzeige des Dialogfelds während der Lesevorgang. Standardmäßig verwendet der ProgressMonitorInputStream
available
des übergebenen InputStream
, um den Maximalwert des ProgressMonitor
zu initialisieren. Der Wert kann für einige InputStreams
korrekt sein, ist aber nicht besonders, wenn Sie Daten über das Netzwerk übertragen.
available()
liefert eine Abschätzung der Anzahl von Bytes, die lesen (oder übersprungen) von diesem Eingabestrom ohne Blockierung durch den nächsten Aufruf einer Methode für diesen Eingangsstrom sein kann.
Dieser anfängliche maximale Wert ist auch der Grund, warum Sie manchmal das Dialogfeld sehen. Der Dialog wird automatisch geschlossen, nachdem der Maximalwert der Fortschrittsleiste erreicht wurde. Um etwas Nützliches anzuzeigen, müssen Sie dem ProgressMonitor
einige Hinweise zur Startposition und zur Endposition in Form von setMinimum
und setMaximum
geben.
// using a File just for demonstration/testing
File f = new File("a");
try (InputStream stream = new FileInputStream(f)) {
ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", stream);
int downloadSize = f.length();
ProgressMonitor pm = pmis.getProgressMonitor();
pm.setMillisToDecideToPopup(0);
pm.setMillisToPopup(0);
// tell the progress bar that we start at the beginning of the stream
pm.setMinimum(0);
// tell the progress bar the total number of bytes we are going to read.
pm.setMaximum(downloadSize);
copyInputStreamToFile(pmis, new File("/tmp/b"));
}