我要将多个对象写入文件,然后在我的代码的另一部分中检索它们。我的代码没有错误,但它无法正常工作。你能帮我找一下我的代码有什么问题吗? 我从不同的网站上读过不同的代码,但没有一个能为我工作!
这是我将对象写入文件的代码: MyClassList是一个arraylist,它包含我的类的对象(必须写入文件)。
for (int cnt = 0; cnt < MyClassList.size(); cnt++) {
FileOutputStream fout = new FileOutputStream("G:\\address.ser", true);
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(MyClassList.get(cnt));
}
我在输出流的构造函数中添加了“true”,因为我想将每个对象添加到文件末尾。这是对的吗?
这是我从文件中读取对象的代码:
try {
streamIn = new FileInputStream("G:\\address.ser");
ObjectInputStream objectinputstream = new ObjectInputStream(streamIn);
MyClass readCase = (MyClass) objectinputstream.readObject();
recordList.add(readCase);
System.out.println(recordList.get(i));
} catch (Exception e) {
e.printStackTrace();
}
它最终只打印一个对象。现在,我不知道我写的不正确还是正确阅读!
答案 0 :(得分:67)
为什么不立刻序列化整个列表?
FileOutputStream fout = new FileOutputStream("G:\\address.ser");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(MyClassList);
当然,假设MyClassList是ArrayList
或LinkedList
,或另一个Serializable
集合。
在阅读它的情况下,在你的代码中你只准备了一个项目,没有循环来收集所有写的项目。
答案 1 :(得分:44)
正如其他人建议的那样,您可以一次序列化和反序列化整个列表,这更简单,似乎完全符合您的意图。
在这种情况下,序列化代码变为
ObjectOutputStream oos = null;
FileOutputStream fout = null;
try{
fout = new FileOutputStream("G:\\address.ser", true);
oos = new ObjectOutputStream(fout);
oos.writeObject(myClassList);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if(oos != null){
oos.close();
}
}
反序列化变为(假设myClassList是一个列表并希望你使用泛型):
ObjectInputStream objectinputstream = null;
try {
FileInputStream streamIn = new FileInputStream("G:\\address.ser");
objectinputstream = new ObjectInputStream(streamIn);
List<MyClass> readCase = (List<MyClass>) objectinputstream.readObject();
recordList.add(readCase);
System.out.println(recordList.get(i));
} catch (Exception e) {
e.printStackTrace();
} finally {
if(objectinputstream != null){
objectinputstream .close();
}
}
您也可以按照以下方式对文件中的多个对象进行反序列化:
ObjectInputStream objectinputstream = null;
try {
streamIn = new FileInputStream("G:\\address.ser");
objectinputstream = new ObjectInputStream(streamIn);
MyClass readCase = null;
do {
readCase = (MyClass) objectinputstream.readObject();
if(readCase != null){
recordList.add(readCase);
}
} while (readCase != null)
System.out.println(recordList.get(i));
} catch (Exception e) {
e.printStackTrace();
} finally {
if(objectinputstream != null){
objectinputstream .close();
}
}
请不要忘记在finally子句中关闭流对象(注意:它可以抛出异常)。
修改强>
正如评论中所建议的那样,最好使用try with resources,代码应该变得更加简单。
以下是列表序列化:
try(
FileOutputStream fout = new FileOutputStream("G:\\address.ser", true);
ObjectOutputStream oos = new ObjectOutputStream(fout);
){
oos.writeObject(myClassList);
} catch (Exception ex) {
ex.printStackTrace();
}
答案 2 :(得分:1)
一个简单的程序,可将对象写入文件并从文件读取对象。
package program;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class TempList {
public static void main(String[] args) throws Exception {
Counter counter = new Counter(10);
File f = new File("MyFile.txt");
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(counter);
oos.close();
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
Counter newCounter = (Counter) ois.readObject();
System.out.println(newCounter.count);
ois.close();
}
}
class Counter implements Serializable {
private static final long serialVersionUID = -628789568975888036 L;
int count;
Counter(int count) {
this.count = count;
}
}
运行该程序后,控制台窗口中的输出为10,您可以通过单击下图所示的图标在“测试”文件夹中找到该文件。
答案 3 :(得分:0)
我认为你必须将每个对象写入一个自己的文件,否则你必须在阅读它时拆分它。 您也可以尝试序列化列表,并在反序列化时检索它。
答案 4 :(得分:0)
如果序列化整个列表,则在读取文件时还必须将文件反序列化为列表。这意味着你将不可避免地在内存中加载一个大文件。它可能很贵。如果您有一个大文件,并且需要逐行(>&gt;逐个对象),只需继续您的初步想法。
序列化:
LinkedList<YourObject> listOfObjects = <something>;
try {
FileOutputStream file = new FileOutputStream(<filePath>);
ObjectOutputStream writer = new ObjectOutputStream(file);
for (YourObject obj : listOfObjects) {
writer.writeObject(obj);
}
writer.close();
file.close();
} catch (Exception ex) {
System.err.println("failed to write " + filePath + ", "+ ex);
}
反序列:
try {
FileInputStream file = new FileInputStream(<filePath>);
ObjectInputStream reader = new ObjectInputStream(file);
while (true) {
try {
YourObject obj = (YourObject)reader.readObject();
System.out.println(obj)
} catch (Exception ex) {
System.err.println("end of reader file ");
break;
}
}
} catch (Exception ex) {
System.err.println("failed to read " + filePath + ", "+ ex);
}