我有一個應用程序可以序列化並讀取/寫入Java中的一些自定義對象。來自ObjectInputStream構造函數的EOFException
我的一個客戶有一個特定的文件(只有一個),只要將文件讀入ObjectInputStream
構造函數就會拋出一個EOFException
。
java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
java.io.ObjectInputStream.readStreamHeader(Unknown Source)
java.io.ObjectInputStream.(Unknown Source)
編輯:對不起,我的錯。我忘了提,我通過這個代碼接收文件:
File folder = new File(path);
File[] files = folder.listFiles();
因此,該文件確實就存在爲File#listFiles()
被取回。
所以在下面從環路收到的代碼file
:
for(File file : files)
因此,IOException
不應該從文件是丟失(因爲爲什麼會listFiles()
退貨嗎?)。
END-EDIT 我想這可能是由於從所述對象的失敗偏寫入毛刺,所以我增加代碼來刪除問題文件是否有一個EOFException
:
try (InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is);) {
// Do stuff...
} catch (IOException e) {
if(e instanceof EOFException) {
file.delete();
}
ErrorHandler.handleError(e);
}
儘管此代碼執行成功,但並未實際刪除文件。 (我仍然經常在日誌中看到錯誤)。所以,我選擇讓我的客戶端手動搜索並刪除這個文件。他搜索,找到並刪除它。他向我確認它已成功刪除該文件。但是,即使他手動刪除它,這個錯誤仍然彈出!
儘管這是一個Java程序,但我懷疑這是一個Windows文件系統故障,所以Java與此無關。有沒有人有似乎在那裏但不是的「幽靈」文件的經驗?或者似乎被刪除,但不?
這是一個令人困惑的問題。不可能對我重現。
恩,也許'IOException'是「找不到文件」。 –
在SO上尋求幫助的第一條規則是發佈_entire_堆棧跟蹤。無論如何,請注意EOF發生在'ObjectInputStream $ PeekInputStream'中,所以OIS是「啓動泵」,可以這麼說。顯然,文件沒有足夠的數據來創建一個完整的對象,並且是空的或者被破壞的,或者被另一個進程獨佔鎖定的,這就解釋了爲什麼你不能刪除它。 –
@BrianRoach,對不起。我忘了在這個問題上添加一些關鍵細節。但'IOException'不會來自找不到的文件。請閱讀上面的修改。 – ryvantage