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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:10:19