2014-01-23 91 views
0

我能夠從http位置讀取小於2GB的文件。但是,如果我嘗試讀取大於2 GB的文件,我會得到異常。我沒有完全閱讀,而是以大塊閱讀。以下是我的代碼片段和異常消息。幫我櫃面,如果你有一個線索進行進一步2GB限制Java輸入流

BufferedOutputStream bos = new BufferedOutputStream(os); 
        URL url = new URL(fileName); 
        LOGGER.debug(url.toString()); 
        URLConnection connection = url.openConnection(); 

        LOGGER.debug("Before getting input stream 100 MB, open input stream::" + downloadFileName); 
        // BufferedInputStream in = new BufferedInputStream(url.openStream()); 
        InputStream in = url.openStream(); 
        // InputStreamReader inReader = new InputStreamReader(in); 

        // InputStream in = connection.getInputStream(); 
        LOGGER.debug("Afters getting input stream, open inputstream::" + downloadFileName); 
        // in. 

        // LOGGER.debug("in1::" + in1); 

        final byte[] buffer = new byte[100 * 1024 * 1024]; // 100Mb 
        while (true) 
        { 
         LOGGER.debug("Reading.."); 

         final int read = in.read(buffer); 
         LOGGER.debug("Read.."); 

         if (read < 0) 
         { 
          break; 
         } 
         LOGGER.debug("Writing.."); 
         bos.write(buffer, 0, read); 

         LOGGER.debug("Wrote.."); 

         // bos. 

        } 
+1

你能/你有沒有試過改變JVM的最大堆大小? – bcr

+0

您可以嘗試閱讀而不寫(註釋掉bos)並檢查它是否可以讀取超過2GB的數據? –

+6

「連接重置」表示* remote peer *丟棄連接。您的問題可能與2 GB大小無關,如果是這樣,它就在*發件人*一方。 –

回答

0

[SPACE] [ActiveMQ的會話任務] [createreviseswpart_0:69:1:1:1] DEBUG 10時33分55秒(CreateReviseSWPart.java: 348) - 籤異常:: java.net.SocketException異常:連接復位

尋找在用於SocketException它指出

拋出,表明有創建或訪問一個Socket錯誤的Javadoc。

這很可能是由TCP錯誤引起的。

在你的情況下,似乎連接已被服務器端連接關閉。這可能有很多種原因...

嘗試使用類似Wireshark的工具調試網絡流量來查看實際數據包。 您試過使用其他工具(wget/curl/webbrowser?)訪問2GB文件嗎?

0

「連接重置」是指連接已經在問題的插座就在你身邊的活動「由對等連接復位」是指在另一端處有另一面(對)熄滅再見握手的標準協議

這無助於確定真正的問題在哪裏(如果它在代碼中),但冷卻會讓你走向正確的方向。

Wireshark可以幫助識別網絡中的「飛行」以及是否存在連接關閉。它適用於你的環境嗎?

其他有趣的事情是監視是否有一些超時。

2GB是一個奇怪的尺寸,所以我更願意向您推薦:

如果兩者在JAVA 2GB可能是一個極限。內存(緩衝區)也可能是一個限制。我們假設對方是好的。


2 GB是JVM限制它的相關爲Integer.MAX_VALUE

這不是衆所周知的和錯誤的代碼隨處可見。

在某些情況下,有一種變通方法http://todayguesswhat.blogspot.it/2012/07/file-download-java-servlet-example-2gb.html


您的解決方案在分割使用自定義數據包或相關隊列塊....

這長的活動引起的,但具有最差吞吐量的缺點,可以解決超時。

+0

這對連接重置錯誤有什麼影響?可能遠程服務器有這個限制(如果它運行的是java),但上面顯示的客戶端代碼應該工作得很好嗎? –

+0

@PeterLiljenberg @PeterLiljenberg「連接重置」表示連接超時,「對等重置連接」表示連接超時或由於網絡條件丟失 – user1594895

+0

對於記錄,「連接重置」和「連接重置同伴「是同義詞;某些平臺上的一些代碼路徑報告一個,另一個則報告一個。本地超時會導致「操作/連接超時」,並且如果連接在本地主動關閉,您將得到「流關閉」或「套接字關閉」。 –

0

BufferedInputStream接口對其索引和marklimit使用有符號整數,這意味着它的上限爲2gig(Integer.MAX_VALUE個字節)。如果讀取的文件大於該文件,則會翻轉爲負值,並且標記限制比較失敗。