为什么我无法从我的文件中读取列表对象 (Java IO)
Why I cannot read List object from my file (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);
但是当我将阅读方法更改为 return 列表时:
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传递一个保持引用值的变量,你可以' 更改该值(正确,您只能在方法内部更改该值)
想象一下,在将它传递给方法之前它指向 null
在方法内部,您正试图将它指向另一个对象(分配新的引用值)
当方法结束时它会被丢弃,它仍然指向 null
您的 List obj 只是对您在 main() 中初始化的列表的引用。只要方法正在执行,这个引用就在堆栈上。当您为 obj 分配一个新值时,obj 将指向该值。正如您可能期望的那样,您没有更改 result 的值。你要做的是
obj.addAll(readObject)
我有一个方法将 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);
但是当我将阅读方法更改为 return 列表时:
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传递一个保持引用值的变量,你可以' 更改该值(正确,您只能在方法内部更改该值)
想象一下,在将它传递给方法之前它指向 null
在方法内部,您正试图将它指向另一个对象(分配新的引用值) 当方法结束时它会被丢弃,它仍然指向 null
您的 List obj 只是对您在 main() 中初始化的列表的引用。只要方法正在执行,这个引用就在堆栈上。当您为 obj 分配一个新值时,obj 将指向该值。正如您可能期望的那样,您没有更改 result 的值。你要做的是
obj.addAll(readObject)