阅读一些有关 Java 文件 I/O 管理的资料,我了解到输入和输出操作有不止一种选择。
这些是:
BufferedReader
和 BufferedWriter
FileReader
和 FileWriter
FileInputStream
和 FileOutputStream
InputStreamReader
和 OutputStreamWriter
Scanner
班级以下哪一个是文本文件管理的最佳替代方案?序列化的最佳替代方案是什么? Java NIO 对此有何评论?
一般来说有两个“世界”:
当它是一个文件(或套接字,或数据库中的 BLOB,或...)时,它始终是二进制数据first。
其中一些二进制数据可以被视为为文本数据(其中涉及称为“编码”或“字符编码”)。
InputStream
/OutputStream
类(通常,名称中包含 Stream
的所有内容)。
FileInputStream
和 FileOutputStream
:这些 从 读取和 写入 文件,并且它们处理二进制数据。
Reader
/Writer
类。
每当您需要将二进制数据转换为文本(或反之亦然)时,您就需要某种编码(常见的是 UTF-8、UTF-16、ISO-8859-1(以及相关的)以及古老的 US -ASCII)。 “幸运的是”Java 平台还有一种称为“默认平台编码”的东西,只要需要它就会使用它,但代码没有指定它。
平台默认编码是一把双面剑,但是:
BufferedReader
,它可以包裹在任何其他 Reader
周围,并增加一次处理整行的能力。
Scanner
是一个特殊的类,用于将文本输入解析为标记。它对于结构化文本最有用,但经常用于System.in
,以提供一种非常简单的方式从标准输入读取数据(即从用户在键盘上输入的内容)。
现在,令人困惑的是,有一些类在这些世界之间架起桥梁,它们的名称中通常包含“两个部分”:
anInputStreamReader
消耗a
InputStream
并且 本身就是a
Reader
。an OutputStreamWriter
是
Writer
并且 写入
OutputStream
。
a
FileReader
FileInputStream
与 InputStreamReader
的组合a
FileWriter
FileOutputStream
与 OutputStreamWriter
的组合
FileReader
和
FileWriter
过去有一个主要缺点:它们使用平台默认编码,这可能不是您想要做的!在 Java 11 中,他们终于有了双参数构造函数,因此在想要提供编码时仍然可以使用它们。序列化怎么样?
和
ObjectInputStream
是用于序列化的特殊流。由于类的名称意味着序列化仅涉及二进制数据(即使序列化
String
对象),因此您需要专门使用
*Stream
类。只要您避免任何 Reader
/Writer
课程,就应该没问题。更多资源