You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ObjectInputStream读取对象时抛出java.io.EOFException求助

解决ObjectInputStream读取时抛出EOFException的问题

兄弟,看你的代码一眼就发现问题啦——你连续调用了两次os.readObject()!

咱们捋一捋:你用ObjectOutputStream往文件里只写了一个Student对象对吧?那读取的时候,第一次os.readObject()就已经把这个对象从文件里读出来了,此时文件指针已经走到末尾了。结果你紧接着又调用了一次os.readObject(),这时候文件里已经没有数据可读了,自然就抛出java.io.EOFException了。

修正后的代码

把多余的那行os.readObject()删掉就行,改成这样:

public class ObjInputObjOutput { 
    public static void main(String[] args) { 
        FileInputStream fs; 
        ObjectInputStream os; 
        try{ 
            fs=new FileInputStream("C:\\Users\\MYPC\\Desktop\\temp.txt"); 
            os=new ObjectInputStream(fs); 
            // 只调用一次readObject(),直接强转并接收
            Student s=(Student) os.readObject(); 
            System.out.println(s.toString()); // 建议把toString()结果打印出来,不然白读了
            // 记得关闭流,避免资源泄漏
            os.close();
            fs.close();
        }catch(Exception e){
            e.printStackTrace(); // 别只打印半截,完整异常栈更方便排查问题
        } 
    }
}

额外注意事项

  • 你的Student类必须实现Serializable接口,否则读取时会抛出NotSerializableException,示例代码如下:
import java.io.Serializable;
public class Student implements Serializable {
    // 类的成员变量、构造方法、toString()等内容...
}
  • 如果后续要往文件里写入多个对象,读取时要对应调用多次readObject(),或者用循环读取直到捕获EOFException(这是多对象读取的常规写法),比如:
try{
    fs=new FileInputStream("C:\\Users\\MYPC\\Desktop\\temp.txt"); 
    os=new ObjectInputStream(fs); 
    while(true){
        try{
            Student s=(Student) os.readObject();
            System.out.println(s.toString());
        }catch(EOFException e){
            // 读到文件末尾,退出循环
            break;
        }
    }
    os.close();
    fs.close();
}catch(Exception e){
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者coc champ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:33:31