2014-11-23 38 views
0

我正在編寫一個程序,通過網絡將文件從一臺PC複製到另一臺PC。當這個文件複製正在進行時,我向用戶顯示進度以及動態複製了多少文件(在JSP中完成)。在服務器端,我使用的是Java,而且對於大多數文件來說工作都很順利,但是如果我遇到了一個50 MB的文件,我打了一些牆,而我的程序只是在那裏呆了一段時間,它最終開始寫入輸出儘管流。這是由於只是將文件加載到輸入流中?我知道這個文件有點大,所以不知道我能做些什麼。下面是我用來將文件複製到服務器的代碼。任何建議或幫助將不勝感激。完全打開重新設計這個東西,我只想讓它很容易讀取複製的文件進度。使用FileInputStream麻煩複制大文件

FileInputStream fin = null; 
    FileOutputStream fout = null; 
    int length = (int)srcFile.length(); 

    int counter = 0; 

    int r = 0; 

    byte[] b = new byte[4096]; 
    try 
    { 

     fin = new FileInputStream(srcFile); 

     fout = new FileOutputStream(dd); 
     int progressVal = 0; 
     while((r = fin.read(b)) != - 1) 
     { 

      counter += r; 
      fout.write(b,0,r); 
      progressVal = (counter * 100/length); 


      if(progressVal > 0) 
      { 
       //communicate to JSP 
       WorkstationController.progressMade = progressVal; 

      } 

     } 


    } 
    catch (Exception e) 
    { 

      e.printStackTrace(); 

    } 
    finally 
    { 
     fin.close(); 
     fout.close(); 
    } 
+0

你是什麼意思的「打牆」。如果你的意思是進度條在一段時間內保持0,那麼這是預期的,因爲在進展到1之前,它需要讀取和寫入至少1%的文件(500 KB)。我會將跟蹤添加到代碼看看發生了什麼。 – 2014-11-23 15:54:41

回答

0

可能取決於許多因素。什麼版本的Java?取決於版本,默認堆和permgen大小會有所不同。你可能會碰到堆大小的限制,並導致jvm在垃圾回收中發生顛簸以恢復空間。

你可以做的事情之一就是嘗試用不同的大小來分塊數據。另外,嘗試包裝流BufferedInput/OuputStreams。