Java|Java:理解Java中的字节流和字符流

Java|Java:理解Java中的字节流和字符流

文章图片


Java通过称为流的抽象来执行I/O操作 。Java定义了两种基本类型的流 , 称为字节流和字符流 。 字节流类提供了一种方便的方式来处理字节的输入和输出 , 而字符流分别提供了一种方便的方式来处理字符的输入和输出 。 本文详细阐述了Java中流处理的这两个概念 。

流概述
从Java的角度来看 , “流”本质上是指一种抽象 , 用于产生和消费顺序信息流 。 信息流可以是在链接到Java I/O子系统的任何物理设备上执行的输入或输出操作的结果 。 实际链接的设备可能会有所不同 , 例如本地存储设备或网络 。 但是 , 基本原理保持不变 。 通常Java流支持多种设备 , 如键盘、网络套接字、磁盘文件等 。 因此 , 它为实际链接到的不同类型的设备提供了一种方便的方式来处理I/O操作 。 steam类捆绑在java.io包中 。字节流和字符流
Java中有两种类型的流:字节和字符 。 当I/O流管理8位字节的原始二进制数据时 , 称为字节流 。 并且 , 当I/O流管理16位Unicode字符时 , 称为字符流 。Unicode 集基本上是一种字符集 , 其中每个字符对应于给定字符集中的特定数值 。 通常 , 每种编程语言都采用特定的字符集来表示和管理其对字符的使用 。 除了Unicode , 另一个常用的字符集是ASCII , 由国际标准组织 (ISO) 定义 。 在Java(1.0 版)开始时 , 它没有字符流;因此 , 所有I/O操作都是面向字节的 。 字符流是后来引入的(1.1 版) 。 请注意 , 字符流和字节流的概念不应与低级I/O操作混在一起;毕竟 , 它们总是位和字节 。 但是 , 字符流和字节流本质上提供了一种方便高效的方式来处理Java中的数据流 。
有什么不同?
如前所述 , 差异只是为了方便 。 有些流本质上是面向字节的 , 有些是面向字符的 。 因此 , 使用I/O流包中定义的适当类和方法来处理它们总是很方便 。 例如 , FileOutputStream用于读取原始字节流 , 例如图像数据 。 同样 , FileOutputStream 对象可用于写入原始字节流 。 在类似的情况下 , 可以分别使用基于面向字符的数据流FileReader和FileWriter来读写文件 。 这些类提供了特定的方法来操作适当的流数据 。

字节流类
在字节流类层次结构的顶部 , 有两个抽象类:InputStream 用于面向字节的输入 , OutputStream 用于面向字节的输出操作 。 分层布局如下:
InputStream:面向字节的输入流的顶级抽象类 。
ByteArrayInputStream:此类的一个实例包含一个用于读取字节流的内部缓冲区 。
FilterInputStream:此类的一个实例包含一些其他输入流 , 作为进一步操作的基本数据源 。
BufferedInputStream:这使FilterInputStream实例能够使用缓冲区来存储输入数据 。
DataInputStream:此类的一个实例能够以与机器无关的方式从底层输入流中读取原始 Java 类型 。
LineNumberInputStream:此类的一个实例有助于跟踪输入流的当前行号 。
PushbackInputStream:这提供了在读取数据字节后推回或“未读”数据字节的能力 。
FileInputStream:此类的一个实例用于从文件系统中的文件中获取输入字节 。
ObjectInputStream:该类的一个实例用于在对象被 ObjectOutputSteam 序列化后对其进行反序列化 。
PipedInputStream:这个类的一个实例为输入字节提供了一个管道或缓冲区 , 它以 FIFO 方式工作 。
SequenceInputStream:此类的一个实例表示两个或多个输入流的逻辑串联 , 这些输入流一个接一个地依次读取 。
OutputStream:面向字节的输入流的顶级抽象类 。 在java培训中 , 有更加系统全面的课程 , 明确清晰的学习路线 , 学习起来既轻松 , 又高效 。