【问题标题】:Why does ObjectOutputStream write symbols to a file instead of my input? [duplicate]为什么 ObjectOutputStream 将符号写入文件而不是我的输入? [复制]
【发布时间】:2017-04-10 09:09:45
【问题描述】:

我正在尝试将名为ClientsArrayList 写入文件。它可以工作,但不幸的是它只是将符号写入文件而不是我的实际输入。

下面是我的代码:

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

如何让它发挥作用?

【问题讨论】:

  • 你了解writeObject 的作用吗?
  • 它以二进制格式打印。它不适合人类阅读。
  • 或者更重要的是,您了解ObjectOutputStream 的作用吗?它创建一个序列化 Java 对象和值的二进制流。如果您想要文本,请创建 FileWriter 而不是 FileOutputStream,并可选择将其包装在 PrintWriter 和/或 BufferedWriter 中。
  • @dimo414 这个问题的症结在于 OP 期望创建一个文本文件,并且两个副本都准确地解决了这个问题。

标签: java objectoutputstream


【解决方案1】:

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

您可以改为使用FileWriterBufferedWriterPrintWriter,它们有多个write[...](...) 方法将文本写入文件。在这种情况下,您必须将每个变量都写为String 等,而不是整个类。 Here你可以找到一个例子。

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

【讨论】:

    【解决方案2】:

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

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

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

    如果您需要文字,请使用PrintWriterBufferedWriter

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2013-12-14
      • 1970-01-01
      • 2017-10-02
      相关资源
      最近更新 更多