Java 使用objectInputStream读取时发生EOFEException

Java 使用objectInputStream读取时发生EOFEException,java,Java,我想将对象写入文件并读取它们,但我遇到了错误。javaMain.java中的第51行是while循环,它应该显示对象 Exception in thread "main" java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2626) at java.io.ObjectInputStream.readObject0(Object

我想将对象写入文件并读取它们,但我遇到了错误。java
Main.java
中的第51行是while循环,它应该显示对象

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();
}
String fileName=“c://Users//lukas//obj.txt”;
人员p1=新人员(“Jan”,“Kowalski”,21);
人员p2=新人员(“Jan”,“Kowalski”,21);
OutputStream文件OutputStream=null;
ObjectOutput objectOutputStream=null;
OutputStream bufferOut=null;
试一试{
fileOutputStream=新的fileOutputStream(文件名);
bufferOut=新的BufferedOutputStream(fileOutputStream);
objectOutputStream=新的objectOutputStream(bufferOut);
objectOutputStream.writeObject(p1);
objectOutputStream.writeObject(p2);
objectOutputStream.close();
}最后{
if(objectOutputStream!=null){
objectOutputStream.close();
}
fileOutputStream.close();
bufferOut.close();
objectOutputStream.close();
}
试一试{
FileInputStream FileInputStream=新的FileInputStream(文件名);
InputStream bufferIn=新的BufferedInputStream(fileInputStream);
ObjectInputStream ObjectInputStream
=新的ObjectInputStream(bufferIn);
Person readCase=null;
List recordList=new ArrayList();
做{
readCase=(Person)objectInputStream.readObject();
if(readCase!=null){
recordList.add(readCase);
}
}while(readCase!=null);
fileOutputStream.close();
objectOutputStream.close();
}捕获(FileNotFoundException错误){
err.printStackTrace();
}
怎么了

do {
        readCase = (Person) objectInputStream.readObject();
        if (readCase != null) {
            recordList.add(readCase);
        }
} while (readCase != null);
这个循环不正确
readObject()
在流结束时不返回null。它可以在任何时候编写null。在流的末尾,它抛出
EOFException
。因此:

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

正如在注释中指出的,您尝试读取更多对象,然后再存储,如果您还不知道存储的对象的数量,您也可以这样尝试:

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

好的,您只写一个对象,但您读取的对象不止一个,所以您在尝试读取第二个对象时会得到一个EOFEException,如文档所示。请注意,您不需要关闭所有流。只有最外面的一个。使用try-with-resources。添加两个对象时仍然存在错误。我更新了代码。因为你的循环试图读取3。也就是说,它一直读到它变为null,但这永远不会发生,因为readObject()不会在文件末尾返回null。它抛出了一个异常。那么我可以改变我的while循环吗?这并不比你的第一个版本好。它仍然不会在流的末尾返回null,所以在非null时循环是不正确的。你仍然只写了一个对象。你在读@JBNizet告诉你的吗?