用于读写文件的适当Java类?

时间:2013-10-17 14:51:31

标签: java file serialization file-io text-files

阅读有关Java文件I / O管理的一些资料,我知道输入和输出操作有多种替代方法。

这些是:

  • BufferedReaderBufferedWriter
  • FileReaderFileWriter
  • FileInputStreamFileOutputStream
  • InputStreamReaderOutputStreamWriter
  • Scanner class

这些是文本文件管理的最佳替代方案吗?什么是序列化的最佳替代方案? Java NIO对此有何评论?

1 个答案:

答案 0 :(得分:20)

两种数据

一般来说,有两个“世界”:

  • 二进制数据
  • 文字数据

当它是文件(或套接字,或DB中的BLOB,或......)时,它始终是二进制数据首先

某些二进制数据可以处理作为文本数据(涉及称为"encoding" or "character encoding"的内容)。

二进制数据

每当您想要处理二进制数据时,您需要使用InputStream / OutputStream类(通常,名称中包含Stream的所有内容)。

这就是FileInputStreamFileOutputStream的原因:那些读取,写入文件并处理二进制数据。

文本数据

每当您想要处理 text 数据时,您需要使用Reader / Writer类。

每当你需要将二进制数据转换为文本(反之亦然)时,你需要某种编码(常见的是UTF-8,UTF-16,ISO-8859-1(及相关的)和良好的编码旧的US-ASCII)。 “幸运的是”Java平台还有一个称为“默认平台编码”的东西,它会在需要时使用,但代码没有指定一个。

平台默认编码是双面剑,但是:

  • 它使编写代码更容易,因为您不必为每个操作指定编码,但
  • 它可能与您拥有的数据不匹配:如果平台默认编码为ISO-8859-1且您读取的文件实际上是UTF-8,那么您将获得一个混乱的输出!

为了阅读,我们还应该提到BufferedReader,它可以缠绕在任何其他Reader上,并添加一次处理整行的能力。

Scanner是一个特殊类,用于将文本输入解析为标记。它对结构化文本最有用,但经常在System.in上使用,以提供一种从stdin读取数据的非常简单的方法(即用户在键盘上输入的内容)。

弥补差距

现在,令人困惑的是,有些类可以在这些世界之间建立桥梁,这些世界通常在其名称中包含两个部分

  • InputStreamReader 消耗 InputStream本身Reader
  • OutputStreamWriter Writer写入 OutputStream

然后有“快捷类”基本上结合了两个经常组合的类。

  • FileReader基本上是FileInputStreamInputStreamReader
  • 的组合
  • FileWriter基本上是FileOutputStreamOutputStreamWriter
  • 的组合

请注意FileReaderFileWriter与更复杂的“手工制作”替代方案相比有一个主要缺点:他们始终使用平台默认编码,这可能不会是你想要做的!

序列化怎么样?

ObjectOutputStreamObjectInputStream是用于序列化的特殊流。

由于类的名称意味着序列化仅涉及二进制数据(即使序列化String个对象),因此您将只想使用*Stream类。只要你避免任何Reader / Writer课程,你应该没事。

更多资源