2013-05-05 78 views
0

我有以下代碼成功地複製了一個文件。但是,有兩個問題是:)FileInputStream/FileOutputStream阻止?

  1. 的的System.out.println(在progressBar.setValue()後不打印0和100之間(間隔只是打印「0」,直到結束的地方打印「100」)
  2. 除了進度條的值可能由於問題#1而出錯的事實,在實際的代碼中,我也在進行其他視覺更改,但是直到整個文件才顯示被處理。我認爲FileInputStream/FileOutputStream函數是非阻塞的。如何更改以下代碼,以便在操作過程中實際更新進度欄?

startJob方法:

private void startJob(File inFile, File outFile) { 
     long offset = 0; 
     int numRead = 0; 
     byte[] bytes = new byte[8192]; 
     long fileLength = inFile.length(); 
     Boolean keepGoing = true; 

     progressBar.setValue(0); 

     try { 
      inputStream = new FileInputStream(inFile); 
      outputStream = new FileOutputStream(outFile, false); 
      System.out.println("Total file size to read (in bytes) : " + inputStream.available()); 
     } catch (FileNotFoundException err) { 
      inputStream = null; 
      outputStream = null; 
      err.printStackTrace(); 
     } catch (IOException err) { 
      inputStream = null; 
      outputStream = null; 
      err.printStackTrace(); 
     } 

     if (inputStream != null && outputStream != null) { 
      while (keepGoing) { 
       try { 
        numRead = inputStream.read(bytes); 
        outputStream.write(bytes, 0, numRead); 
       } catch (IOException err) { 
        keepGoing = false; 
        err.printStackTrace(); 
       } 
       if (numRead > 0) { 
        offset += numRead; 
       } 

       if (offset >= fileLength) { 
        keepGoing = false; 
       } 

       progressBar.setValue(Math.round(offset/fileLength) * 100); 
       System.out.println(Integer.toString(Math.round(offset/fileLength) * 100)); 
      } 
     } 
     if (offset < fileLength) { 
      //error 
     } else { 
      //success 
     } 

     try { 
      inputStream.close(); 
      outputStream.close(); 
     } catch (IOException err) { 
      err.printStackTrace(); 
     } 
    } 
+0

[不確定JProgressBar更新已無法正常工作(HTTP的可能重複://計算器。 com/questions/8812718/jprogressbar-update-not-working) – 2013-05-05 17:46:29

+1

您是否使用[ProgressMonitorInputStream](http://docs.oracle.com/javase/7/docs/api/javax/swing/ProgressMonitorInputStream.html )?這可以爲你簡化很多工作。 – 2013-05-05 17:46:46

+1

FileInputStream如何能夠非阻塞並仍然返回已讀取的內容? – 2013-05-05 17:47:42

回答

1

我懷疑你在呼喚從EDT您漫長的方法。通過將其放置在它自己的Runnable例如取下EDT您的操作,然後調用

SwingUtilities.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
     progressBar.setValue(value); 
     // or any other GUI changes you want to make 
    }  
}); 

否則,你的操作塊EDT,直到它完成,並與EDT阻止像重繪沒有事件等將可已處理 - >直到最後才能看到GUI更改。

1

表達式Math.round(offset/fileLength)的值將始終等於0(零),因爲offset < fileLength

UPD:

如果你想這樣做正確的計算,你必須將其更改爲:

Math.round(((double)offset/(double)fileLength) * 100)