Java 使用objectInputStream读取时发生EOFEException
我想将对象写入文件并读取它们,但我遇到了错误。javaJava 使用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
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告诉你的吗?