将对象写入文本文件的最佳方法

时间:2013-08-23 09:21:35

标签: java serialization file-handling fileinputstream printwriter

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

我发现的另一种方法是序列化。序列化看起来像它的工作,但后来我发现它不能将对象附加到文件,因为它的流标题一直在覆盖。是否有方法使用序列化将对象附加到文件?

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

感谢您的时间。

4 个答案:

答案 0 :(得分:2)

正如我从您的问题描述中看到的那样,

JAXB将是您的最佳选择。 Here是一个简单的例子。

自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();
        }
    }
}