java学习之I/O流

牵着蜗牛去西藏 发布于 2015/07/16 09:39
阅读 540
收藏 0

初学者在刚开始学习Java的时候总是会烟花缭乱,不知道怎么去选择,IO提供了两个包java.io,java.nio包,笔者在这里旨在从宏观上把握,整理了一个关于java IO流的一个框架,以期对后续学习有所指引。

1.什么是I/O流?

I/O流代表了输入源或者输入目的地。一个流可以表示各种各样的源和目的地,例如磁盘,其他设备,网络,其他程序以及内存数组等等。

流支持各种数据,包括最简单的字节,基本数据类型,本地化的字符和对象。一些流仅仅传递数据,另一些流以有用的形式对数据进行加工或者转化。

对于使用流的应用程序而言,不管流内部如何工作,他们都是一个同样的简单模型,那就是:流就是一个数据序列。

一个程序使用输入流来从数据源一个条目一个条目地读取数据,如下图所示:


一个程序使用输出流向目的地一个条目一个条目地写入数据,如下图所示:


2. 流的分类

根据流的传输特性和与数据源的关联特点,可以将流分为三类,下面逐一讲述。

2.1 流的方向划分——输入流(Input Stream)和输出流(Output Stream)

根据流的流动方向可以分为输入流(Input Stream)和输出流(Output Stream).

输入流只能从中读取数据而不能写入,输出流正好与其相反。

java I/O为输入和输出分别实现了相应的类,稍后将介绍。

2.2 传输单位划分——字符流(Character Stream)和字节流(Byte Stream)

根据流传输数据单位可以划分为,字符流(Character Stream)和字节流(Byte Stream).

字节流以字节(8 bits)为单位进行数据传输,每次传送一个或多个字节;字符流以字符(16 bits)为单位进行数据传输,每次传送一个或多个字符.

java I/O包为字符流和字节流分别实现了两套类来完成数据操作,稍后将介绍。

2.3 流与数据源的关联特点划分——节点流(Node Stream)和处理流(Processing Stream)

根据数据流所关联的是数据源还是其他数据流,可划分为节点流(Node Stream)和处理流(Processing Stream)。

节点流,直接连接到数据源,一般用于直接用于直接从指定的位置进行读/写操作,例如磁盘文件、内存区域、网络连接等,其中一般只提供一些基本的读写操作方法,功能比较单一。

处理流,它并不直接连接到数据源,往往用于对其他输入/输出流进行封装,对内容进行过滤处理,所以又称过滤流,一般提供了一些功能比较强大的读写方法。

鉴于节点流和处理流的特点,在实际应用中,通常是将节点流和处理流二者结合起来使用:节点流直接与指定的源或目标相连,而处理流则对节点流或其他处理流进一步进行封装,提供更丰富的输入/输出操作能力。

关于节点流和处理流,可参看下面的示意图:


3.流的层次关系

java中的流大方向上分为两个层次,一个层次用于处理字节输入输出;另一个层次处理字符的输入和输出。另外I/O包中还定义了一些接口。

这里记住Java命名的惯例,凡是以InputStream或OutputStream结尾的类型均为字节流,凡是以Reader或Writer结尾的均为字符流。

3.1 字节流

字节输入流的类间关系图如下所示:

字节输出流的类间关系图如下所示:

关于字节流,可以小结一下:

1) InputStream /OutputStream是所有的输入/出字节流的父类,它们都是一个抽象类。

2) 按处理数据介质区分:

ByteArrayInputStream/ByteArrayOutputStream是像字节数组输入/输出的字节流类;

FileInputStream/ FileOutputStream是像本地文件输入/输出的字节流类 是三种基本的介质流;

PipedInputStream/ PipedOutputStream 是从与其它线程共用的管道中读取或者写入数据;

3) 按处理数据类型区分:

InputStream和OutputStream,所操作的基本单元就是字节,每次读取和写入单个字节或是字节数组;

DataInputStream和DataOutputStream,支持以二进制形式操纵的原始数据类型,如byte,int等。

ObjectInputStream和ObjectOutputStream,支持以二进制形式操纵的基本数据类型和对象类型。

4) 装饰器流

所有FilterInputStream/ FilterOutputStream的子类都是装饰流(装饰器模式的主角)。 例如PushbackInputStream支持回退操作,将读取的一个字节重新送回,下次可继续读取;InflaterInputStream用来支持解压缩数据。

5)标准输入输出流

java提供了标准输入输出流,System.in,System.out和System.err,他们都是字节流。其中System.out and System.err被定义为PrintStream对象,他们虽然是字节流,但是它利用内部字符流对象模拟了字符流的大部分特性;而System.in它没有字符流特性,要想将他当做字符流使用,可以使用如下代码:

InputStreamReader cin = new InputStreamReader(System.in);

同时,另一种替代标准输入输出流的是Console类,这是一个final类,Console类通过reader()和writer()方法提供了字符输入输出流。

3.2 字符流

字符输入流的类间关系如下图所示:

文章转载自DevStore

加载中
返回顶部
顶部