2016-05-02 5 views
2

URLから大きなファイルをダウンロードしようとしていますcommons.io Apacheライブラリです。 これは私のコードですjava - 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(); 

しかし、ポップアップは表示されません。または、正直言って、ポップアップは1ミリ秒だけ表示され、消えますが、ダウンロードには約10秒かかります。

答えて

2

一般InputStreamは、現在の位置または外部長さに対する全長に関する情報を提供しません。 InputStreamを参照 availiable()は、InputStreamの合計サイズではなく、現在の位置を取得するか、合計サイズを取得するようなものはありません。また、ストリームのチャンク/パートだけを読むこともできます。プログレスバーでも、ストリームの全長を把握できても、たとえば512バイトなどしか読み込めないことが分かりません。

ProcessMonitorInputStreamは、付属のInputStreamを装飾し、読み取り操作中にダイアログボックスの進行状況バーを更新します。デフォルトではProgressMonitorInputStreamavailableInputStreamになり、ProgressMonitorの最大値が初期化されます。この値は、一部のInputStreamsでは正しいかもしれませんが、ネットワーク経由でデータを転送する場合は特にそうはありません。

available()この入力ストリームのための方法の 次の呼び出しによって、ブロックせずにこの入力ストリームから 読むことができる(またはスキップできる)推定バイト数を返します。

この初期値は、ダイアログボックスが表示されることがある理由もあります。プログレスバーの最大値に達すると、ダイアログが自動的に閉じます。 有用なものを表示するには、setMinimumsetMaximumの形式で開始位置と終了位置に関するヒントをProgressMonitorに与える必要があります。

 // 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")); 
    } 
関連する問題