适用于读写文件的Java类?

适用于读写文件的Java类?,第1张

适用于读写文件的Java类? 两种数据

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

  • 二进制数据
  • 文字数据

当它是一个文件(或插座,或在DB,还是......一个BLOB),那么它总是二进制数据 第一次

这些二进制数据中的某些可以 视为
文本数据(其中包含所谓的“编码”或“字符编码”)。

二进制数据

每当您要处理 二进制
数据时,都需要使用

InputStream
/
OutputStream
类(通常,
Stream
名称中包含的所有内容)。

这就是为什么有a

FileInputStream
和a
的原因
FileOutputStream
:它们
文件中 读取写入 文件,并且它们处理二进制数据。

文字数据

每当您要处理 文本
数据时,都需要使用

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

然后有一些“快捷方式类”,它们基本上将另外两个经常组合的类组合在一起。

  • a
    FileReader
    基本上是a
    FileInputStream
    与a的组合
    InputStreamReader
  • a
    FileWriter
    基本上是a
    FileOutputStream
    与a的组合
    OutputStreamWriter

请注意,

FileReader
FileWriter
较复杂的“手工构建”替代方案相比,它还有一个主要缺点:它们 始终
使用平台默认编码,这可能不是您要尝试的!

序列化呢?

ObjectOutputStream
并且
ObjectInputStream
是用于系列化专用流。

正如类的名称所暗示的那样,序列化仅涉及二进制数据(即使序列化

String
对象),因此您将只想使用
*Stream
类。只要避免使用任何
Reader
/
Writer
类,就应该没问题。

更多资源
  • 基本I / O路径。
  • Joel关于Unipre的陈旧文章(很好的介绍,对技术细节略有了解)
  • 关于平台默认编码的弊端(也是this)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5040449.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存