2016-05-02 1 views
2

Je suis en train de télécharger un fichier volumineux à partir de l'URL avec commons.io bibliothèque Apache. Voici mon code:java - barre de progression lors du téléchargement avec 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(); 

Mais il ne montre pas le menu contextuel. Ou, pour être honnête, la popup apparaît et disparaît seulement pour un millisec, alors que le téléchargement prend environ 10secs.

Répondre

2

Un InputStream générique ne fournit pas d'informations sur la position actuelle ou la longueur totale à l'extérieur. Voir InputStream availiable() n'est pas la taille totale de la InputStream et il ne s'agit pas d'obtenir la position actuelle ou obtenir la taille totale. Vous pourriez également lire seulement des morceaux/parties du flux, même la barre de progression serait capable de comprendre la longueur totale du flux, il ne saura pas que vous allez seulement lire par exemple 512 octets. Le ProcessMonitorInputStream décore le InputStream fourni et met à jour la barre de progression de la boîte de dialogue pendant l'opération de lecture. Par défaut le ProgressMonitorInputStream utilise available du InputStream passé pour initialiser la valeur maximale du ProgressMonitor. La valeur peut être correcte pour certains InputStreams mais n'est pas spécialement lorsque vous transférez des données via le réseau.

available() retourne une estimation du nombre d'octets qui peuvent être lecture (ou sauté) à partir de ce flux d'entrée sans bloquer par l'invocation suivante d'un procédé de ce flux d'entrée. Cette valeur max initiale est également la raison pour laquelle vous voyez parfois la boîte de dialogue.

La boîte de dialogue se ferme automatiquement après que la valeur maximale de la barre de progression est atteinte. Afin d'afficher quelque chose d'utile, vous devez donner le ProgressMonitor quelques conseils sur la position de départ et la position de fin sous la forme de setMinimum et setMaximum.

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