**Java I/O系统**
**Java I/O系统概述**
我们知道,一个Java程序可以从控制台接收数据,并输出到控制台中。数据保存在内存中的对象里,一旦Java程序运行完毕后,对象就会在内存中消失,对象所包含的数据也就消失了。那么,有没有什么方法可以将内存中的数据保存下来,以便下次运行程序的时候可以使用?此外,除了通过控制台设备接收和输出数据外,我们能不能从其它设备接收数据,并将数据保存或输出到其它设备呢?
Java类库提供了大量类,可以帮助我们从不同的设备读取数据,并保存或输出到不同的设备中。这些类统一放在java.io包和java.nio包中,统称Java I/O系统。这里,I是英文单词Input的缩写,中文含义为输入;O是英文单词Output的缩写,中文含义为输出。
如果我们查看JDK说明文档java.io包,会发现Java I/O系统是相当庞大的,要完全掌握这些类并非易事。然而,如果我们在学习I/O系统时,掌握I/O系统设计的一些规律,就能很快掌握这些类的用法。
要深入学习Java I/O系统,首先必须理解流(Stream)的概念。
那么,什么是流呢?流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源设备的流,这个数据源设备可以是文件、内存或网络连接。
类似的,当程序需要写入数据的时候,就会开启一个通向目的地设备的流。这时候我们就可以想象数据好像在这其中“流”动一样。这个概念和自然界中的水流、气流类似
流是Java I/O的基础,是Java语言对I/O的一个最基本的抽象。之所有采用流作为I/O最基本的抽象,是因为流有两个最基本的特性:一是它含有流质,而是它有方向。在计算机中,流质就是数据,方向就是读或写。
对流的读或写就是针对设备进行信息的输入或输出。我们可以将流理解为传送数据的管道。管道的一段是固定的,就是系统的内存;管道的另一端连的是不同的设备。当管道所连是输入设备时,可以通过这个管道将输入设备所得到的数据读取到内存的变量中。同样,如果管道所连的是输出设备,可以通过它将内存变量中的数据输出到输出设备中。
流使得输入输出的方式变得统一,Java I/O类库基于流的思想来构建,并提供了各类流和创建流的机制来完成对不同设备的读写。
**流的分类**
对于Java I/O类库对应的java.io包,我们可以将它看成是存放各种类型流的仓库。根据流中的流质和流向的不同,io包中的流被分为许多类型。以下我们讲解流的分类规则。
1)输入流和输出流
流按照数据流的方向分,可以分为两种类型,分别是:
输入流。从数据源读取数据到程序中。只能从中读取数据,而不能向其写入数据。io包中的输入流都继承自抽象类InputStream或Reader。
输出流。将数据从程序写入数据目的地。只能从中写入数据,而不能从中读取数据。io包中的输出流都继承自抽象类OutputStream或Writer。
在I/O库中的每个输入流都可以找到对应的输出流。
2)字节流和字符流
流按照处理数据的最小单位的不同,可以分为两种类型,分别是:
字节流。字节流是以byte为最小单位进行数据传送。io包中的字节流都继承自抽象类InputStream或OutputStream。
字符流。字符流是以char为最小单位进行数据传送。io包中的字符流都继承自抽象类Reader或者Writer。
I/O库做出这种区分是为了满足处理文字型数据的需要。我们知道byte是8位的,char是16位的。在Java中,各种语言的文字都以Unicode形式编码,Unicode编码是基于16位的char,所以在读写文字型的数据时通过字符流会更有效率、更方便。而一些二进制数据的读写,比如图像、声音等,则仍必须通过字节流来完成。
字节流的类名以InputStream或OutputStream结尾,字符流的类名以Reader或Writer结尾。字节流对应的内存变量类型是byte[],字符流对应的内存变量类型是char[]。
3)节点流和处理流
流按照流的功能分,可以分为两种类型,分别是:
节点流。节点流是可以直接从/向一个特定的数据源(例如磁盘文件、内存、网络)读/写数据的流。节点流也称低级流。例如所有从InputStream或Reader派生的类都有一个基本的read()方法,用于读取单一的字节或者字节数组;而对所有从OutputStream或Writer派生的类都有一个基本的write()方法,用于写入单一的字节或者整个字节数组。但在实际应用中,一般很少使用单一的流类来产生输入输出流,而是使用这两个方法给其他的流类提供数据,通过多个流对象的连接和封装使用实际的流。
处理流。处理流不直接连接到设备,而是连接在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写功能。处理流也称高级流。
如果我们对照流的这些分类方法,研究Java I/O类,我们会发现:I/O库中的这些类,呈现出一种对称性。这种对称体现在两个方面:一是输入流和输出流的对称,二是字节流和字符流的对称。以上的对称性将I/O库分为4个区间。各个区间内分布的流都是平行的相互对应的,同一区间的流对应的I/O类都有相同的后缀。
在I/O类库中,流名称的后缀表明了它的类别,流名称的前缀一般和它要处理的对象或设备有关。在每个具体的区间中,管道又可以根据节点流和处理流进一步分类。例如,BufferedInputStream类,前缀为Buffered,表明它要处理的是内存缓冲区中的数据,后缀为InputStream,表明它是一个字节流和输入流。如果查看它的构造器,我们会发现它的构造器带一个InputStream类型参数&#
深沉的夜: 这波解释满分,谢谢up解疑
迷迭香迷魂香: 内容能重新排一下版就更好了