gpt4 book ai didi

java - 从文件中读取多个对象,就像它们在数组中一样

转载 作者:行者123 更新时间:2023-12-02 03:07:04 25 4
gpt4 key购买 nike

我想询问社区您对以下情况有何看法。任务是将对象写入文件。这可以通过将对象列表写入文件来实现,我稍后可以读取该文件,以便我再次拥有我的对象。在这里,我实际上只会向文件写入一个对象,即列表(可能包含更多对象)。

但是,任务似乎是将单独的对象写入该方法从列表接收的文件。对象可以是任何东西。 (当然它们必须是可序列化的)

所以我做到了:

public class TaskStream {
public static void saveObjects(ArrayList<Object> al) {
try {
FileOutputStream fos = new FileOutputStream("outputFile", true);
try {
ObjectOutputStream oos = new ObjectOutputStream(fos);
for (Object o : al){
try {
oos.writeObject(o);
System.out.println("saved");
} catch (NotSerializableException e) {
System.out.println("An object was not serializable, it has not been saved.");
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}

}

这工作得很好。

但是现在,我想阅读它们。我关于它的第一个概念是一种方法,它读取对象直到文件有对象,然后我可以将它们中的每一个再次保存到列表中(这就是任务)。就像伪代码一样:

for(Object o : fileToRead){ list.add(o) }

这怎么可能呢?我开始尝试使用 ObjectInputStream 的 readObject 方法,但它似乎会导致很多错误。

你有什么想法吗?或者这样的任务的最佳实践是什么?

<小时/>

谢谢!

我尝试了你的想法。具体实现:

public static ArrayList<Object> readObjects(){
ArrayList<Object> al = new ArrayList<Object>();
boolean cont = true;
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("outputFile"));
while(cont){
Object obj=null;
try {
obj = ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(obj != null)
al.add(obj);
else
cont = false;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return al;
}

为了测试程序,我将向文件中写入两个对象。我从文件中读取对象并将它们添加到列表中。我遍历这个列表并打印出内容。

如果我运行程序,会发生以下情况(我删除了输出文件,因此程序可以重新创建它并从头开始做所有事情)。

结果:

列表中的两个对象将被成功打印。但我收到了这个:

java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2598)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1318)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)

...

我没有更改任何内容,然后再次运行该程序。结果:

列表中的两个对象将被成功打印。但我收到了这个:

java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1377)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)

从现在开始,任何重新运行都会产生相同的结果。

如果我再次从头开始重复整个过程(从删除输出文件开始),一切都会发生完全相同的情况(如预期)。

您有解决办法吗?非常感谢您的帮助!

最佳答案

您将需要使用 FileInputStream 和 ObjectInputStream。

FileInputStream fis = new FileInputStream("outputFile");
ArrayList<Object> objectsList = new ArrayList<>();
boolean cont = true;
while (cont) {
try (ObjectInputStream input = new ObjectInputStream(fis)) {
Object obj = input.readObject();
if (obj != null) {
objectsList.add(obj);
} else {
cont = false;
}
} catch (Exception e) {
// System.out.println(e.printStackTrace());
}
}

关于java - 从文件中读取多个对象,就像它们在数组中一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27409718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com