java - 用于读取和写入文件的正确 Java 类?

标签 java file serialization file-io text-files

阅读一些关于 Java 文件 I/O 管理的资源,我了解到输入和输出操作有不止一种选择。

它们是:

  • BufferedReaderBufferedWriter
  • FileReaderFileWriter
  • FileInputStreamFileOutputStream
  • InputStreamReaderOutputStreamWriter
  • 扫描器

以下哪些是文本文件管理的最佳替代方案?序列化的最佳替代方案是什么? Java NIO 是怎么说的?

最佳答案

两种数据

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

  • 二进制数据
  • 文本数据

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

一些二进制数据可以处理为文本数据(这涉及到一个叫做 "encoding" or "character encoding" 的东西)。

二进制数据

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

这就是为什么有一个 FileInputStream和一个 FileOutputStream : 那些读取写入文件并且它们处理二进制数据。

文本数据

无论何时你想处理文本数据,你都需要使用Reader/Writer类。

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

平台默认编码是一把双刃剑,但是:

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

对于阅读,我们还应该提到 BufferedReader它可以包裹在任何其他 Reader 上,并增加了一次处理整行的能力。

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

弥合差距

现在,令人困惑的是,有些类在这些世界之间架起桥梁,它们的名称中通常包含两个部分:

  • InputStreamReader 消费 InputStream 并且本身是一个Reader
  • OutputStreamWriter 是一个 Writer写入 OutputStream

还有一些“快捷方式类”,它们基本上组合了另外两个经常组合的类。

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

请注意,FileReaderFileWriter 与其更复杂的“手工构建”替代方案相比有一个主要缺点:它们总是使用平台默认编码,这可能不是您想要做的!

序列化呢?

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

正如类名所暗示的那样,序列化仅涉及二进制数据(即使序列化 String 对象),因此您需要专门使用 *Stream 类。只要避免使用任何 Reader/Writer 类,就应该没问题。

更多资源

关于java - 用于读取和写入文件的正确 Java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19430071/

相关文章:

java - 后值在循环数组队列中无法正常工作

java - 工厂设计模式中类的创建

java - 我尝试重命名照片以将它们移动到另一个文件夹。我的代码有什么问题导致 File.renameTo(File) 返回 false?

c - 终端输入串口命令,输出Arduino Tx

java - 无法在井字游戏的java游戏中绘制字符串

html - 从 Common Lisp 在浏览器中打开 HTML 页面

windows - 从特定文件夹中获取特定文件

c# - JSON.NET 序列化对象,其中属性名称以点开头

c# - SerializationException 类型 "is not marked as serializable"- 但它是

java - 连续的服务器请求导致 hibernate 异常问题, session 的不安全使用