2017-03-15 41 views
0

我想將對象寫入文件和讀取他們讀書,但我發現了錯誤。 Main.java中的51行是應該顯示對象的while循環。EOFException類,而與ObjectInputStream的

Exception in thread "main" java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2626) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1321) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 
    at com.sdajava.rwobj.Main.main(Main.java:51) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

我的代碼:先寫對象並讀取它們。數據寫入文件。

String fileName = "c://Users//lukas//obj.txt"; 
Person p1 = new Person("Jan", "Kowalski", 21); 
Person p2 = new Person("Jan", "Kowalski", 21); 

OutputStream fileOutputStream = null; 
ObjectOutput objectOutputStream = null; 
OutputStream bufferOut = null; 
try { 

    fileOutputStream = new FileOutputStream(fileName); 
    bufferOut = new BufferedOutputStream(fileOutputStream); 
    objectOutputStream = new ObjectOutputStream(bufferOut); 

    objectOutputStream.writeObject(p1); 
    objectOutputStream.writeObject(p2); 
    objectOutputStream.close(); 
} finally { 
    if (objectOutputStream != null) { 
     objectOutputStream.close(); 
    } 
    fileOutputStream.close(); 
    bufferOut.close(); 
    objectOutputStream.close(); 
} 

try { 

    FileInputStream fileInputStream = new FileInputStream(fileName); 
    InputStream bufferIn = new BufferedInputStream(fileInputStream); 
    ObjectInputStream objectInputStream 
      = new ObjectInputStream(bufferIn); 

    Person readCase = null; 
    List<Person> recordList = new ArrayList<>(); 
    do { 
     readCase = (Person) objectInputStream.readObject(); 
     if (readCase != null) { 
      recordList.add(readCase); 
     } 
    } while (readCase != null); 

    fileOutputStream.close(); 
    objectOutputStream.close(); 

} catch (FileNotFoundException err){ 
    err.printStackTrace(); 
} 

出了什麼問題?

+1

好了,你只寫一個對象,但你讀不止一個,所以試圖讀取第二個對象,當你得到一個EOFException類,如記錄。請注意,您不需要關閉所有流。只有最外面的一個。使用試用資源。 –

+0

當我添加兩個對象錯誤STIL存在。我更新了我的代碼。 – lukassz

+1

因爲你的循環嘗試閱讀3.也就是說,它讀取,直到它得到空,但永遠不會發生,因爲的readObject()不會在文件的結尾返回null。它引發一個異常。 –

回答

1
do { 
     readCase = (Person) objectInputStream.readObject(); 
     if (readCase != null) { 
      recordList.add(readCase); 
     } 
} while (readCase != null); 

這個循環是不正確的。在流結束時,readObject()不返回空值。它可以在你寫任何一個null的時候這樣做。在流結束時拋出EOFException。所以:

for (;;) { 
    try { 
     readCase = (Person) objectInputStream.readObject(); 
     recordList.add(readCase); 
    } 
    catch (EOFException exc) { 
     break; 
    } 
} 
0

如你想了解更多的對象,然後存儲,此外,如果萬一你不知道的存儲對象的數量,你可以嘗試這樣的評論中指出:

try{ 
    while(true) 
    recordList.add((Person) objectInputStream.readObject()); 
} 
catch(EOFException ex){ 
    //All objects are read when control is here 
} 
相關問題