为啥 ObjectOutputStream 将符号写入文件而不是我的输入? [复制]

Posted

技术标签:

【中文标题】为啥 ObjectOutputStream 将符号写入文件而不是我的输入? [复制]【英文标题】: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 中。 How to write Serialized Object as Human readable Txt file的可能重复 @dimo414 这个问题的症结在于 OP 期望创建一个文本文件,并且两个副本都准确地解决了这个问题。 【参考方案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

【讨论】:

以上是关于为啥 ObjectOutputStream 将符号写入文件而不是我的输入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我已经实现了Serializable,可是为啥还有错误

为啥 C 或 C++ 标准不明确将 char 定义为有符号或无符号?

通过 ObjectOutputStream 发送文件,然后将其保存在 Java 中?

当我尝试将数据保存在 txt (java) 中时,为啥我会得到这些符号

为啥当我尝试将主键设置为无符号时出现 errno150

为啥有符号负数转换为无符号数?