我想知道将对象保存到文件的最佳方法是什么?在这个意义上保存,需要附加对象。 当我搜索互联网时,我发现printwriter以toString方法的格式保存对象,但是如果它以toString格式将对象保存到文件中,程序员如何使用它来访问对象中的实例。 我的意思是,如果我使用printwriter将学生对象保存到文本文件(该对象有名称,ID和年龄),我将来如何使用它来比较一个学生的年龄与另一个学生的年龄/搜索通过id等 由于对象保存为字符串,因此只能将其作为字符串读取,以便如何访问对象的实例?
我发现的另一种方法是序列化。序列化看起来像它的工作,但后来我发现它不能将对象附加到文件,因为它的流标题一直在覆盖。是否有方法使用序列化将对象附加到文件?
目前这些是我发现用于编写对象的唯一两种方法,但似乎我不能使用任何这些方法,因为使用printwriter保存时,它将被读取为字符串,如果我使用序列化,我只能存储一个记录。
感谢您的时间。
答案 0 :(得分:2)
自1.6以来,JAXB是标准JDK的一部分,因此您不需要任何其他库。 还支持集合序列化,因此您可以轻松实现“追加”任务。
答案 1 :(得分:1)
可能是一个好主意(至少在我看来)是使用XStream将整个对象序列化为XML文件。使用该库,您可以序列化整个对象以存储它们,然后使用相同的库自动将XML转换回对象,以便您可以比较它们。
此外,将文件保存为XML格式将允许其他语言处理同一文件。
答案 2 :(得分:1)
为什么不使用FileOutputStream
而不是PrintWriter,只是将数据写入追加模式的文件? FileOutputStream
确实有一个追加模式构造函数。
答案 3 :(得分:1)
如何覆盖 writeStreamHeader 并重置?
ObjectOutputStream ooStream = null;
try{
ooStream = new ObjectOutputStream(new FileOutputStream("object-writer"));
ooStream.writeObject(new ObjectWriter());
} catch(Exception ex){
ex.printStackTrace();
} finally {
if(ooStream != null){
try {
ooStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ObjectOutputStream ooStream2 = null;
try{
ooStream2 = new ObjectOutputStream(new FileOutputStream("object-writer", true)) {
@Override
public void writeStreamHeader() throws IOException {
reset();
}
};
ooStream2.writeObject(new ObjectWriter());
} catch(Exception ex){
ex.printStackTrace();
} finally {
if(ooStream2 != null){
try {
ooStream2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ObjectInputStream oiStream = null;
try {
oiStream = new ObjectInputStream(new FileInputStream("object-writer"));
System.out.println(oiStream.readObject());
System.out.println(oiStream.readObject());
} catch (Exception e) {
e.printStackTrace();
} finally {
if(oiStream != null){
try {
oiStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}