2016-05-02 21 views
2

Ich versuche, eine große Datei von URL mit commons.io Apache-Bibliothek herunterladen. Dies ist mein Code:Java - Progress Bar beim Download mit FileUtils

InputStream stream = new URL(CLIENT_URL).openStream(); 
    ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", stream); 
    ProgressMonitor pm = pmis.getProgressMonitor(); 
    pm.setMillisToDecideToPopup(0); 
    pm.setMillisToPopup(0); 
    FileUtils.copyInputStreamToFile(pmis, new File(LATEST_FILENAME)); 
    pmis.close(); 
    stream.close(); 

Aber es zeigt nicht das Popup. Oder, um ehrlich zu sein, das Popup erscheint und verschwindet nur für eine Millisekunde, während der Download ungefähr 10 Sekunden dauert.

Antwort

2

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 ProgressMonitorInputStreamavailable 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")); 
    }