为什么我无法从文件中读取列表对象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,...
        }
    }
    return null;
}

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

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

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

解决方法

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

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

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

,

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

obj.addAll(readObject)