2014-01-21 73 views
1

我有一個應用程序可以序列化並讀取/寫入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與此無關。有沒有人有似乎在那裏但不是的「幽靈」文件的經驗?或者似乎被刪除,但不?

這是一個令人困惑的問題。不可能對我重現。

+1

恩,也許'IOException'是「找不到文件」。 –

+1

在SO上尋求幫助的第一條規則是發佈_entire_堆棧跟蹤。無論如何,請注意EOF發生在'ObjectInputStream $ PeekInputStream'中,所以OIS是「啓動泵」,可以這麼說。顯然,文件沒有足夠的數據來創建一個完整的對象,並且是空的或者被破壞的,或者被另一個進程獨佔鎖定的,這就解釋了爲什麼你不能刪除它。 –

+0

@BrianRoach,對不起。我忘了在這個問題上添加一些關鍵細節。但'IOException'不會來自找不到的文件。請閱讀上面的修改。 – ryvantage

回答

0

該文件爲空,或不包含完整的對象流標題。在任何一種情況下,它都是腐敗的,而且當你編寫它時,你應該已經檢測到它。

當您創建文件時,您可能未能關閉ObjectOutputStream

+0

關閉失敗應該會導致'ObjectInputStream#readObject()'拋出一個錯誤,但是這個錯誤在構造函數上拋出,而不是在'readObject()'上。問題是,爲什麼構造函數會拋出一個錯誤? – ryvantage

+0

你錯了。關閉失敗可能會導致readObject()或構造函數拋出異常。有一個流頭被構造函數讀取。看到Javadoc。如果它不完全在那裏,你會得到你所得到的。你應該調查的是失敗的結局。 – EJP

相關問題