使用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
相关产品推荐
相关产品推荐

