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

时间:2020-10-02 17:32:39

标签: java java-io fileinputstream objectinputstream

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

2 个答案:

答案 0 :(得分:1)

您正在更改其参考值,Java是按值传递,当您将对象作为参数传递给方法时,Java传递保留参考值的变量,则不能更改该值(正确地,您可以仅在方法内部更改该值)

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

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

答案 1 :(得分:0)

您的列表obj只是对您在main()中初始化的列表的引用。只要该方法正在执行,此引用就在堆栈上。当您为obj分配新值时,obj指向该值。您没有像预期的那样更改结果的值。你要做的就像是

obj.addAll(readObject)