0

我想知道将对象保存到文件的最佳方法是什么?从某种意义上说,需要附加对象。当我在互联网上搜索时,我发现 printwriter 以它的 toString 方法的格式保存一个对象,但是如果它将一个对象以 toString 格式保存到一个文件中,程序员如何使用它来访问一个对象中的一个实例。我的意思是,如果我使用 printwriter 将学生对象保存到文本文件中(该对象有名称、ID 和年龄),我以后如何使用它来比较一个学生的年龄和另一个学生的年龄/搜索通过 id 等。由于对象被保存为字符串,它只能作为字符串读取,所以我如何访问对象的实例?

我发现的另一种方法是序列化。序列化看起来像是完成了这项工作,但后来我发现它不能将对象附加到文件中,因为它的流标头一直在覆盖。有没有一种方法可以使用序列化将对象附加到文件中?

目前,这是我发现的用于写入对象的仅有的两种方法,但似乎我不能使用这些方法中的任何一种,因为当使用 printwriter 保存时,它将被读取为字符串,如果我使用序列化,我只能存储一条记录。

感谢您的时间。

4

4 回答 4

2

正如我从您的问题描述中看到的那样,JAXB将是您的绝佳选择。是一个简单的例子。

JAXB 是自 1.6 以来标准 JDK 的一部分,因此您不需要任何额外的库。还支持集合序列化,因此您可以轻松实现“追加”任务。

于 2013-08-23T09:29:16.070 回答
1

一个好主意(至少在我看来)是使用XStream将整个对象序列化为 XML 文件。使用该库,您可以序列化整个对象以存储它们,然后使用同一个库将 XML 自动转换回对象,以便您可以比较它们。

此外,将内容作为 XML 保存到 File 将允许其他语言能够处理相同的文件。

于 2013-08-23T09:29:11.067 回答
1

为什么不使用FileOutputStreamPrintWriter 而不是简单地将数据以附加模式写入文件?FileOutputStream确实有一个附加模式构造函数。

于 2013-08-23T09:43:36.243 回答
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();
        }
    }
}
于 2013-08-23T09:51:36.957 回答