2016-11-26 58 views
0

我正在尝试将我的ArrayList(名为Clients)写入文件。它可以工作,但不幸的是它只是将符号写入文件而不是我的实际输入。为什么ObjectOutputStream将符号写入文件而不是我的输入?

下面是我的代码:

public void SaveToFile() { 

    try 
    { 
     FileOutputStream fos = new FileOutputStream("CustomerLists.txt"); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(Clients); 
     oos.close(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

我如何工作的呢?

+4

你明白'writeObject'的作用吗? – Makoto

+1

它以二进制格式打印。这并不意味着人类可读。 – 4castle

+1

或者更重要的是,您是否了解['ObjectOutputStream'](https://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html)的作用?它创建一个**二进制**串行化Java对象和值的流。它需要文本,创建一个['FileWriter'](https://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html)而不是'FileOutputStream',并且可选地包装在['PrintWriter'](https://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html)和/或['BufferedWriter'](https:// docs。 oracle.com/javase/8/docs/api/java/io/BufferedWriter.html)。 – Andreas

回答

2

你所做的是序列化一个Java对象与文件ObjectOutputStream。这意味着,Java将您的对象Clients转换为一个特定的表示形式,其中涵盖了您的对象具有的所有状态,例如,成员变量。这种表示方式并不是人类可读的,它是一种二进制格式,它比文本格式更高效,适用于类和Java环境。查看here了解更多信息。

你可以做的反而是使用FileWriter,​​或PrintWriter,其中有多个write[...](...)方法写入文本文件。在这种情况下,你必须自己编写每个变量String等,而不是全班。 Here你可以找到一个例子。

对于整个对象,但以完全可定制的方式和人类可读的形式执行与ObjectOutputStream相同的操作的另一种选择是使用Java Architecture for XML Binding (JAXB),但这需要一点阅读。还有用于JSON和其他格式的其他对象序列化库。

1

为什么当我运行这个Java程序时,它会创建文本文件,但它会打印出符号而不是我的输入?

因为它不是文本文件。它是根据Java序列化协议编写的序列化数据,因为您使用的是ObjectOutputStream.writeObject()

这也意味着CustomerLists.txt不是此文件的合适名称。

如果需要文本,请使用PrintWriterBufferedWriter

相关问题