问题描述
我有一种将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,...
}
}
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)