首页 > 解决方案 > 为什么我无法从我的文件中读取 List 对象(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);

但是当我更改阅读方法以返回列表时:

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列表作为参数传递时,我无法得到预期的结果?请帮我。

标签: javajava-iofileinputstreamobjectinputstream

解决方案


您正在更改它的引用值,Java 是按值传递,当您将对象作为参数传递给方法时,java 传递一个保留引用值的变量,您无法更改该值(正确地,您可以更改该值仅限内部方法)

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

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


推荐阅读