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培训中,有更加系统全面的课程,明确清晰的学习路线,学习起来既轻松,又高效。

ByteArrayOutputStream:此类的一个实例包含一个用于写入字节流的内部缓冲区。

FilterOutputStream:此类的一个实例包含一些其他输出流,作为进一步操作的基本数据源。

BufferedOutputStream:这使 FilterOutputStream实例能够使用缓冲区来输出数据。

DataOutputStream:此类的一个实例能够以与机器无关的方式将原始 Java 类型写入底层输出流。

PrintStream:这使 OutputStream 对象能够方便地打印各种数据值的表示形式。

FileOutputStream:此类的一个实例用于输出流,用于将数据写入文件或文件描述符。

ObjectOutputStream:这个类的一个实例用于序列化一个可以用ObjectInputStream反序列化的对象。

PipedOutputStream:这个类的一个实例为输出字节提供了一个管道或缓冲区,它以先进先出的方式工作。

字符流类

在字符流类层次结构的顶部,有两个抽象类:面向字符输入的Reader和面向字符输出操作的Writer。分层布局如下:

Reader:用于读取字符流的顶级抽象类。

BufferedReader:在从字符输入流读取文本时提供中间缓冲区以提高效率。

LineNumberReader:使用缓冲的字符输入流来跟踪行号。

CharArrayReader:实现可用作阅读器的自动递增字符缓冲区。

FilterReader:该类的一个实例用于读取字符文件。

PushbackReader:这使字符能够在读取后被推回流中。

InputStreamReader:这个类的一个实例提供了从字节流到字符流的桥梁。使用指定的字符集将字节解码为字符。

FileReader:该类的一个实例用于读取字符文件。

PipedReader:对字符输入流使用管道。

StringReader:来自源字符串的字符输出流读取器。

Writer:写入字符流的顶级抽象类。

BufferedWriter:在将文本写入字符输出流时提供中间缓冲区以提高效率。

CharArrayWriter:实现可用作写入器的自动递增字符缓冲区。

FilterWriter:用于编写过滤字符流的抽象类。

OutputStreamWriter:这个类的一个实例提供了字符流和字节流之间的桥梁。使用指定的字符集将字符编码为字节。

FileWriter:该类的一个实例用于写入字符文件。

PipedWriter:使用管道进行字符输出流。

PrintWriter:将对象的格式化表示打印到测试输出流。

StringWriter:字符输出流被收集在字符串缓冲区中,可用于构造字符串。

预定义流

Java 提供了三个预定义的流对象:in、out和err,它们在java.lang包的System类中定义。out对象是指标准输出流或控制台。in对象指的是标准输入,也就是键盘。而且,err对象指的是标准错误,它也只是控制台。应该很明显,它们可能被重定向到任何其他兼容的I/O设备,因为System.in只不过是InputStream的一个对象,而System.out和System.err是PrintStream类的对象。因此,它们基本上工作在面向字节的流上,尽管我们可以使用它们在控制台中读取和写入字符。

结论

Java 流充当文件处理包装器,根据相应的I/O结构进行操作。在许多情况下,面向字符的流类和面向字节的流类的功能非常相似。但是,这并不意味着它们没有区别。java.io包中定义的流类相当简单且不复杂,但它们确实起到了作用。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部