我有一种将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
列表作为参数传递时,我无法获得预期的结果?请帮助我。
答案 0 :(得分:1)
您正在更改其参考值,Java是按值传递,当您将对象作为参数传递给方法时,Java传递保留参考值的变量,则不能更改该值(正确地,您可以仅在方法内部更改该值)
想象一下,在将其传递给方法之前,它指向null
内部方法中,您试图将其指向另一个对象(分配新的参考值) 方法结束时将被丢弃,仍然指向null
答案 1 :(得分:0)
您的列表obj只是对您在main()中初始化的列表的引用。只要该方法正在执行,此引用就在堆栈上。当您为obj分配新值时,obj指向该值。您没有像预期的那样更改结果的值。你要做的就像是
obj.addAll(readObject)