Java序列化与IO流问题:无法读取文件全部数据到ArrayList
解决ObjectOutputStream写入后读取仅获第一条数据的问题
常见问题根源及解决方法
1. 重复创建ObjectOutputStream导致序列化头部冲突
如果你的写入逻辑是每次添加数据都新建ObjectOutputStream,文件里会重复写入序列化协议的头部信息。读取时ObjectInputStream读到第一个头部对应的对象后,后续的头部会被识别为无效格式,直接停止读取。
解决: 全程使用同一个ObjectOutputStream实例完成所有写入操作。
示例写入代码:
// 只创建一次流 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.dat", true))) { // 循环写入多个对象 for (User user : userList) { oos.writeObject(user); } oos.flush(); } catch (IOException e) { e.printStackTrace(); }
注:如果是追加写入,要保证第一次写入的头部正常,后续追加必须复用同一个流或避免重复写入头部。
2. 读取逻辑未循环读取到文件末尾
如果你的读取代码只调用了一次readObject(),自然只能拿到第一条数据。需要循环调用直到抛出EOFException(文件结束标志)。
解决: 循环读取并捕获EOFException终止循环
示例读取代码:
List<User> userList = new ArrayList<>(); try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.dat"))) { while (true) { try { User user = (User) ois.readObject(); userList.add(user); } catch (EOFException e) { // 读取到文件末尾,退出循环 break; } } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
额外注意事项
- 要序列化的类必须实现
Serializable接口,且类的所有非瞬态成员变量也必须可序列化。 - 建议显式声明类的
serialVersionUID字段,避免因类结构小改动导致反序列化失败。
内容的提问来源于stack exchange,提问作者Tannu
相关产品推荐
相关产品推荐

