首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EOFException阅读objectInputStream

使用EOFException阅读objectInputStream
EN

Stack Overflow用户
提问于 2017-03-15 17:36:13
回答 2查看 7.1K关注 0票数 1

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

代码语言:javascript
复制
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)

我的代码:首先编写对象并读取它们。数据被写入文件。

代码语言:javascript
复制
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();
}

怎么啦?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-15 18:05:01

代码语言:javascript
复制
do {
        readCase = (Person) objectInputStream.readObject();
        if (readCase != null) {
            recordList.add(readCase);
        }
} while (readCase != null);

这个循环是不正确的。readObject()在流结束时不返回null。它可以在你写空的时候做到这一点。在流的末尾,它抛出EOFException。所以:

代码语言:javascript
复制
for (;;) {
    try {
        readCase = (Person) objectInputStream.readObject();
        recordList.add(readCase);
    }
    catch (EOFException exc) {
        break;
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-03-15 18:05:11

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

代码语言:javascript
复制
try{
  while(true)
    recordList.add((Person) objectInputStream.readObject());
}
catch(EOFException ex){
  //All objects are read when control is here
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42816893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档