我想寫一個接受文件並使用DataInputStream和BufferedInputStream將其寫入特定目錄的服務器。 (字符串)「'文件數量(int)''文件名稱(字符串)''每個文件的長度(長)'和'未解釋字節的文件內容(byte [ ])'java網絡斷開的管道和收到的文件損壞
如果一切都成功了,那麼我應該發送布爾值。
但問題是它沒有正確接收文件。
我不時收到'broken pipe'錯誤消息或文件損壞。
解決了這個問題..
我想寫一個接受文件並使用DataInputStream和BufferedInputStream將其寫入特定目錄的服務器。 (字符串)「'文件數量(int)''文件名稱(字符串)''每個文件的長度(長)'和'未解釋字節的文件內容(byte [ ])'java網絡斷開的管道和收到的文件損壞
如果一切都成功了,那麼我應該發送布爾值。
但問題是它沒有正確接收文件。
我不時收到'broken pipe'錯誤消息或文件損壞。
解決了這個問題..
可能與您的問題有關的一件小事。你應該通過實際讀取的字節數遞減的,而不是字節數文件大小可變,請求讀取:
while(fileSize>0){
if(fileSize < byteSize)
byteSize = (int)fileSize;
int byteRead = din.read(b, 0, byteSize);
fos.write(b);
fileSize -= byteRead; // <-- See here
}
+ 1這很可能是這個錯誤背後的真正問題。如果讀取的字節數少於所需的字節數,可能會導致程序過早退出while循環並錯誤地獲取下一個文件長度。這可能導致在沒有更多數據時保持讀取輸入流。 –
你也應該檢查'byteRead'結果,而不是每次都將整個緩衝區數組寫入輸出,而只是實際讀取的字節數。否則,您可能會將讀取的數據部分寫入輸出兩次。 – Gandalf
它解決了我的問題!謝謝!! –
如果在讀取輸入時,發送方關閉你可能會得到這個錯誤連接。它可能與你的代碼無關。發件人可能已超時,在傳輸完成之前關閉連接或其他許多事情。
的可能的複製[如何解決java.net.SocketException異常:殘破的管道(http://stackoverflow.com/q/2309561/851811) –