【问题标题】:Why I cannot read List object from my file (Java IO) [duplicate]为什么我无法从我的文件中读取列表对象(Java IO)[重复]
【发布时间】:2020-10-02 17:32:39
【问题描述】:

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

【问题讨论】:

    标签: java java-io fileinputstream objectinputstream


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您的 List obj 只是对您在 main() 中初始化的列表的引用。只要方法正在执行,这个引用就在堆栈上。当您为 obj 分配新值时,obj 会指向该值。如您所料,您没有更改结果的值。你所要做的就是

      obj.addAll(readObject)
      

      【讨论】:

        猜你喜欢
        • 2020-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        相关资源
        最近更新 更多