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

如何使用ObjectInputStream从computers.dat读取Computer对象到ArrayList并展示?

从computers.dat读取Computer对象到ArrayList并展示的完整实现

看起来你已经开了个头,我来帮你补全代码并说明关键要点,实现从文件读取对象并展示的功能~

首先要注意:你的Computer类必须实现Serializable接口,否则对象无法被反序列化读取,先给你一个符合要求的Computer类示例:

import java.io.Serializable;

public class Computer implements Serializable {
    private String brand;
    private String model;
    private int ramSize;

    // 构造方法
    public Computer(String brand, String model, int ramSize) {
        this.brand = brand;
        this.model = model;
        this.ramSize = ramSize;
    }

    // 重写toString方法,方便展示对象信息
    @Override
    public String toString() {
        return "Computer{" +
                "brand='" + brand + '\'' +
                ", model='" + model + '\'' +
                ", ramSize=" + ramSize + "GB" +
                '}';
    }

    // 可选:添加getter和setter方法
}

接下来是补全后的ReadComputers类代码,我用了try-with-resources语法来自动管理输入流,避免手动关闭的麻烦和资源泄漏,比原始写法更简洁安全:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class ReadComputers {
    public static void main(String[] args) {
        // 使用try-with-resources自动关闭流资源
        try (FileInputStream fis = new FileInputStream("computers.dat");
             ObjectInputStream ois = new ObjectInputStream(fis)) {

            // 读取文件中的ArrayList对象并强制类型转换
            ArrayList<Computer> computerList = (ArrayList<Computer>) ois.readObject();

            // 遍历列表,调用toString()展示每个Computer对象
            System.out.println("读取到的计算机列表:");
            for (Computer computer : computerList) {
                System.out.println(computer.toString());
            }

        } catch (IOException e) {
            System.err.println("读取文件时发生IO异常:" + e.getMessage());
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            System.err.println("找不到Computer类定义:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

关键细节说明:

  • Serializable接口:这是一个标记接口,没有任何方法,但必须让Computer类实现它,否则JVM无法完成对象的反序列化,会抛出NotSerializableException。
  • try-with-resources:Java 7及以上支持的语法,只要是实现了AutoCloseable接口的资源(比如这里的输入流),都会在try块结束后自动关闭,不用手动写close()方法,避免了忘记关闭导致的资源泄漏。
  • 类型转换:ois.readObject()返回的是Object类型,所以需要强制转换为ArrayList<Computer>,要确保写入computers.dat的确实是这个类型的对象,否则会抛出ClassCastException。
  • 异常处理:把原来的throws声明改成了try-catch捕获异常,这样程序遇到问题时可以给出更友好的提示,而不是直接崩溃退出。

内容的提问来源于stack exchange,提问作者Matthew Thibodeau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:49:19