阅读有关Java文件I / O管理的一些资料,我知道输入和输出操作有不止一种选择。
这些是:
BufferedReader
BufferedWriter
FileReader
FileWriter
FileInputStream
FileOutputStream
InputStreamReader
OutputStreamWriter
Scanner
以下什么是文本文件管理的最佳选择? 序列化的最佳替代方法是什么?Java NIO对此有何评论?
一般来说,有两个“世界”:
当它是一个文件(或插座,或在DB,还是......一个BLOB),那么它总是二进制数据 第一次 。
这些二进制数据中的某些可以 视为 文本数据(其中包含所谓的“编码”或“字符编码”)。
每当您要处理 二进制 数据时,都需要使用InputStream/ OutputStream类(通常,Stream名称中包含的所有内容)。
InputStream
OutputStream
Stream
这就是为什么有a FileInputStream和a 的原因FileOutputStream:它们 从 文件中 读取 和 写入 文件,并且它们处理二进制数据。
每当您要处理 文本 数据时,都需要使用Reader/ Writer类。
Reader
Writer
每当您需要将二进制数据转换为文本(反之亦然)时,则需要某种编码(常见的编码是UTF-8,UTF-16,ISO-8859-1(以及相关的编码)以及比较好的旧US- ASCII)。幸运的是,Java平台还具有一种称为“默认平台编码”的东西,它将在需要它时使用,但代码未指定它。
平台的默认编码是两把剑,但是:
为了阅读,我们还应该提到BufferedReader可以将其包装在其他包装纸上,Reader并增加了一次处理整行的功能。
Scanner是一个特殊的类,用于将文本输入解析为令牌。它对 结构化文本 最有用,但通常用于System.in提供一种非常简单的方法来从stdin读取数据(即从用户在键盘上输入的内容)。
System.in
现在,令人困惑的是,有一些类在这些世界之间架起了一座桥梁,它们的名称通常都有 两个部分 :
然后有一些“快捷方式类”,它们基本上将另外两个经常组合的类组合在一起。
请注意,FileReader与FileWriter较复杂的“手工构建”替代方案相比,它还有一个主要缺点:它们 始终 使用平台默认编码,这可能不是您要尝试的!
ObjectOutputStream并且ObjectInputStream是用于系列化专用流。
ObjectOutputStream
ObjectInputStream
正如类的名称所暗示的那样,序列化仅涉及二进制数据(即使序列化String对象),因此您将只想使用*Stream类。只要避免使用任何Reader/ Writer类,就应该没问题。
String
*Stream