2011-10-07 88 views
0

我想寫一個接受文件並使用DataInputStream和BufferedInputStream將其寫入特定目錄的服務器。 (字符串)「'文件數量(int)''文件名稱(字符串)''每個文件的長度(長)'和'未解釋字節的文件內容(byte [ ])'java網絡斷開的管道和收到的文件損壞

如果一切都成功了,那麼我應該發送布爾值。

但問題是它沒有正確接收文件。

我不時收到'broken pipe'錯誤消息或文件損壞。

解決了這個問題..

+0

的可能的複製[如何解決java.net.SocketException異常:殘破的管道(http://stackoverflow.com/q/2309561/851811) –

回答

3

可能與您的問題有關的一件小事。你應該通過實際讀取的字節數遞減的,而不是字節數文件大小可變,請求讀取:

 while(fileSize>0){ 
      if(fileSize < byteSize) 
       byteSize = (int)fileSize; 
      int byteRead = din.read(b, 0, byteSize); 
      fos.write(b); 
      fileSize -= byteRead; // <-- See here 
     } 
+0

+ 1這很可能是這個錯誤背後的真正問題。如果讀取的字節數少於所需的字節數,可能會導致程序過早退出while循環並錯誤地獲取下一個文件長度。這可能導致在沒有更多數據時保持讀取輸入流。 –

+0

你也應該檢查'byteRead'結果,而不是每次都將整個緩衝區數組寫入輸出,而只是實際讀取的字節數。否則,您可能會將讀取的數據部分寫入輸出兩次。 – Gandalf

+0

它解決了我的問題!謝謝!! –

0

如果在讀取輸入時,發送方關閉你可能會得到這個錯誤連接。它可能與你的代碼無關。發件人可能已超時,在傳輸完成之前關閉連接或其他許多事情。

看看此相關的問題: How to fix java.net.SocketException: Broken pipe?