为什么我无法从我的文件中读取列表对象 (Java IO)

Why I cannot read List object from my file (Java IO)

我有一个方法将 List<String> 写入文件,如下所示:

public static void main(String[] args) {
    List<String> data = Arrays.asList("1", "2", "3", "4", "5");
    writeObjectToFile(data, "demo.dat");
    
    List<String> result = null;
    readObjectFromFile(result, "demo.dat");
    System.out.println(result);
}

使用 writeObjectToFile 方法:

public static <T> void writeObjectToFile(List<T> obj, String fileName) {
    File file = new File(fileName);
    FileOutputStream fos = null;
    ObjectOutputStream oos = null;

    try {
        fos = new FileOutputStream(file);
        oos = new ObjectOutputStream(fos);
        oos.writeObject(obj);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // close fos, oos, ... 
    }
}

readObjectFromFile方法:

public static <T> void readObjectFromFile(List<T> obj, String fileName) {
    File file = new File(fileName);
    FileInputStream fis = null;
    ObjectInputStream ois = null;

    if (file.exists()) {
        try {
            fis = new FileInputStream(file);
            ois = new ObjectInputStream(fis);
            Object readObject = ois.readObject();
            obj = (List<T>) readObject;
            System.out.println(obj);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // close fis, ois,...
        }
    }
}

向文件写入数据正常,但读取步骤不正常。我得到的 result 列表是 null:

// console output
[1, 2, 3, 4, 5] // --> this is result of System.out.println(obj);
null            // --> this is result of System.out.println(result);

但是当我将阅读方法更改为 return 列表时:

public static <T> List<T> readObjectFromFile(String fileName) {
    File file = new File(fileName);
    FileInputStream fis = null;
    ObjectInputStream ois = null;

    if (file.exists()) {
        try {
            fis = new FileInputStream(file);
            ois = new ObjectInputStream(fis);
            Object readObject = ois.readObject();
            List<T> obj = (List<T>) readObject;
            System.out.println(obj);
            return obj;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // close fis, ois,...
        }
    }
    return null;
}

然后我得到了预期的结果:

// console output
[1, 2, 3, 4, 5] // --> this is result of System.out.println(obj);
[1, 2, 3, 4, 5] // --> this is result of System.out.println(result);

我不知道为什么。为什么当我将 result 列表作为参数传递时,我无法得到预期的结果?请帮助我。

你是在改变它的引用值,Java是传值,当你把一个对象作为参数传递给一个方法时,java传递一个保持引用值的变量,你可以' 更改该值(正确,您只能在方法内部更改该值)

想象一下,在将它传递给方法之前它指向 null

在方法内部,您正试图将它指向另一个对象(分配新的引用值) 当方法结束时它会被丢弃,它仍然指向 null

您的 List obj 只是对您在 main() 中初始化的列表的引用。只要方法正在执行,这个引用就在堆栈上。当您为 obj 分配一个新值时,obj 将指向该值。正如您可能期望的那样,您没有更改 result 的值。你要做的是

obj.addAll(readObject)