2012-12-22 57 views
10

我想問問有沒有人知道有關FTP的任何Java 7問題?我已經使用了Sun Net和Apache Commons Net庫,並且都在Java 6上按預期執行。但是,當我將開發環境(Eclipse)切換到1.7時,相同的操作執行速度非常慢(約爲4.5到8KB/s),這些都是本地主機服務器和局域網內的另一臺服務器。爲什麼ftp上傳速度慢java 7

我嘗試了緩衝流,字節到字節的傳輸,關閉Nagle算法,並使用Apache便捷方法storeFile(),後者最終執行加速本地主機,但又放慢了爬行速度在遠程服務器上。我還設置了所有機器來關閉有狀態的FTP過濾。

InputStream is = null; 
    OutputStream os = null; 
    try { 
     is = new BufferedInputStream(prepareInputStream(data)); 
     os = new BufferedOutputStream(prepareOutputStream(data)); 
     if (is == null || os == null) { 
      log.error("Can't build connection"); 
      return; 
     } 

     byte[] buf = new byte[4096]; 
     int c = 1; 

     while (c > 0) { 
      c = is.read(buf); 
      if (c > 0) 
      os.write(buf, 0, c); 
      data.incrCurrentPosition(); 
      fireStateChanged(data); 
     } 
     data.incrCurrentPosition(); 
    } catch (IOException e) { 
     log.error(e.getMessage(), e); 
     setEnabled(false); 
    } catch (Exception e) { 
     log.error(e.getMessage(), e); 
    } finally { 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (os != null) { 
      try { 
       os.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

可以看出,這是非常標準的實現代碼。再次,在Java 6中,事情壓縮得非常快。在Java 7中,Sun和Apache Commons庫的速度減慢了10到20倍。使用像FileZilla這樣的FTP客戶端確認FTP運行正常,所以我認爲它確實與Java 7有關。儘管我可以在網上找到有關問題的任何提及,但大部分情況下,我看到的內容都是關於Java 7和Windows 7防火牆發生衝突。

預先感謝您提供的任何見解。

+1

問:「我認爲它確實與Java 7有關」。答:我真的認爲你可能是對的。嘗試編譯Java 6,並嘗試在JRE6和JRE7上運行* same * .class。我敢打賭你可能會證實你的理論:) – paulsm4

+0

'data'類是什麼? – DWright

+0

對不起,我錯過了這個DWright。我試圖從哈希映射對象到字符串的任意數據類型,只是爲了看看它是否確實是原因,但它們都是相同的,即在Java 6中速度很快,在Java 7中速度很慢。 –

回答

10

請檢查您當前的緩衝區大小是什麼:

ftpClient.getBufferSize(); 

如果您尚未將其設置爲其他值,則該值爲零(0)。 所以,將其設置爲一個較高的值:

ftpClient.setBufferSize(1048576);//1024*1024 

您可以檢查其當前價值爲前:

ftpClient.getBufferSize(); 

順便提一下,公認的答案,setBufferSize(0),沒爲我工作。我使用最新版本的Apache commons,因此該解決方案可能適用於早期版本。如果您將緩衝區大小設置爲零,則當前版本不會有任何更改。

+0

同意你的意見。 –

+0

這給了我很大的時間。謝謝! – user2124871

+1

謝謝。我當時正在使用3.2,你說得對,這個問題在3.3中得到了解決。改變你接受的答案。 –

13

我發現了一些修正,至少在Java 7中正常運行。我通過使用FTPClient的setBufferSize(0);不幸的是,我不認爲Sun的Java 7的Sun Net實現中有類似的方法。這並不重要,因爲我對Apache Commons Net很滿意。希望Oracle能夠在適當的時候做到這一點。

+0

謝謝,這解決了我的問題。任何想法爲什麼這是這種情況? –

+0

哇!我有同樣的問題,並添加ftpClient.setBufferSize(0)刪除上傳時間爲一個文件從117s到6s!這就是我在辦公室稱之爲美好的一天! – Volksman