为啥 ObjectOutputStream 将符号写入文件而不是我的输入? [复制]
Posted
技术标签:
【中文标题】为啥 ObjectOutputStream 将符号写入文件而不是我的输入? [复制]【英文标题】:Why does ObjectOutputStream write symbols to a file instead of my input? [duplicate]为什么 ObjectOutputStream 将符号写入文件而不是我的输入? [复制] 【发布时间】:2017-04-10 09:09:45 【问题描述】:我正在尝试将名为Clients
的ArrayList
写入文件。它可以工作,但不幸的是它只是将符号写入文件而不是我的实际输入。
下面是我的代码:
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。
您可以改为使用FileWriter
、BufferedWriter
或PrintWriter
,它们有多个write[...](...)
方法将文本写入文件。在这种情况下,您必须将每个变量都写为String
等,而不是整个类。 Here你可以找到一个例子。
另一个对整个对象执行与ObjectOutputStream
相同但以完全可定制的方式和人类可读形式的选项是使用Java Architecture for XML Binding (JAXB),但这需要一些阅读。还有其他 JSON 和其他格式的对象序列化库。
【讨论】:
【参考方案2】:为什么当我运行这个 java 程序时它会创建文本文件,但它会打印出符号而不是我的输入?
因为它不是文本文件。它是序列化数据,根据 Java 序列化协议编写,因为您使用的是ObjectOutputStream.writeObject()
。
这也意味着CustomerLists.txt
不是此文件的合适名称。
如果您需要文字,请使用PrintWriter
或BufferedWriter
。
【讨论】:
以上是关于为啥 ObjectOutputStream 将符号写入文件而不是我的输入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C 或 C++ 标准不明确将 char 定义为有符号或无符号?
通过 ObjectOutputStream 发送文件,然后将其保存在 Java 中?