2017-01-15 184 views
1

我遇到了一個奇怪的問題,我似乎不明白。 我正在製作一個從文件讀取數據的程序。但是當我讀取數據時,我立即收到一個EOFException。FileInputStream.available()返回字節,但ObjectInputStream.available()返回0

所以我檢查.available()如果文件是空的或不。我得到了一個奇怪的結果。 FileInputStream表示該文件已填充(249字節),但ObjectInputStream表示該文件爲空(或無法讀取)。 EOFException:「int signatureSize = ois.readInt();」

 FileInputStream fin = new FileInputStream("input(signedbyLK).ext"); 
     System.out.println("fin available: " + fin.available()); 

     ObjectInputStream ois = new ObjectInputStream(fin); 
     System.out.println("ois avaiable: " + ois.available()); 

     int signatureSize = ois.readInt(); 
     byte[] sigBytes = (byte[]) ois.readObject(); 
     String text = (String) ois.readObject(); 
     ois.close(); 

編輯:我將內容添加到該文件是這樣的:

 File newFile = new File("input(signedbyLK).ext"); 
     newFile.createNewFile(); 

     System.out.println("Succesfully created new file: " + newFile.getName()); 

     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(newFile)); 
     oos.writeObject(sigBytes.length); 
     oos.writeObject(sigBytes); 
     oos.writeObject(readInput()); 
     oos.close(); 

回答

1

這裏是javadoc中說

任何試圖讀取對象數據超出邊界由相應的writeObject方法寫入的自定義數據將導致 OptionalFeature拋出,其中eof字段值爲true。 超出分配數據末尾的非對象讀取將以 反映數據結束的方式與它們將指示流末尾的方式相同:字節讀取將返回-1作爲字節讀取或 字節數讀取和原始讀取將拋出EOFException。如果 沒有相應的writeObject方法,則默認的 序列化數據結束標記分配數據的結束。

此外,還需要以相同的順序讀取對象輸入流,當您連載它

+0

我已經編輯我的問題。現在你可以看到我填寫文件的順序。 – Guido

+2

您的讀取呼叫甚至不對應於寫入呼叫。你的第一次寫電話是一個對象,但你的第一次讀是一個int – Biu

+0

哇,我什至沒有注意到這一點。謝謝! – Guido