Java通过称为流的抽象来执行I/O操作。 Java定义了两种基本类型的流,称为字节流和字符流。字节流类提供了一种方便的方式来处理字节的输入和输出,而字符流分别提供了一种方便的方式来处理字符的输入和输出。本文详细阐述了Java中流处理的这两个概念。
流概述
字节流和字符流
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包中定义的流类相当简单且不复杂,但它们确实起到了作用。
发表评论 取消回复