Java 7之传统I/O第1篇- 输入输出流基础框架

       stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。Java的I/O操作类在java.io包下,这些类可以大概分为两类,操作字节流的和操作字符流的类:
(1) 字节流   表示以字节为单位从stream中读取或往stream中写入信息,即java.io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。 
(2) 字符流  以Unicode字符为单位从stream中读取或往stream中写入信息。 


1、字节输入流


下面来看一下操作字节输入流的类的框架结构:

Java 7之传统I/O第1篇- 输入输出流基础框架_第1张图片

由以上的类图可以看出:

  1. InputStream是所有的输入字节流的父类,它是一个抽象类。
  2. ByteArrayInputStreamStringBufferInputStreamFileInputStream是三种基本的介质流,它们分别从Byte数组、StringBuffer和本地文件中读取数据。PipedInputStream是从与其它线程共用的管道中读取数据。
  3. ObjectInputStream和所有FilterInputStream的子类都是装饰流。

各个类的详细的介绍如下:

Java 7之传统I/O第1篇- 输入输出流基础框架_第2张图片
在FilterInputStream类下还有一些具体的子类,如下图:

Java 7之传统I/O第1篇- 输入输出流基础框架_第3张图片


2、字节输出流


操作字节输出流的类的框架结构:

Java 7之传统I/O第1篇- 输入输出流基础框架_第4张图片

可以看到:

  1. OutputStream是所有的输出字节流的父类,它是一个抽象类。
  2. ByteArrayOutputStreamFileOutputStream是两种基本的介质流,它们分别向Byte数组和本地文件中写入数据。PipedOutputStream是向与其它线程共用的管道中写入数据。
  3. ObjectOutputStream和所有FilterOutputStream的子类都是装饰流。下表列出了输出字节流的功能及如何使用它们。

来看一下各个类的具体介绍:

Java 7之传统I/O第1篇- 输入输出流基础框架_第5张图片

在FilterOutputStream类下还有一些具体的子类,如下图所示。
Java 7之传统I/O第1篇- 输入输出流基础框架_第6张图片


3、字符输入流

Java 7之传统I/O第1篇- 输入输出流基础框架_第7张图片

从上图可以看出:    

1.Reader是所有的输入字符流的父类,它是一个抽象类。

2.CharReaderStringReader是两种基本的介质流,它们分别将Char数组、String中读取数据。PipedReader是从与其它线程共用的管道中读取数据。

3. BufferedReader很明显就是一个装饰器,它和其子类负责装饰其它Reader对象。

4.FilterReader是所有自定义具体装饰流的父类,其子类PushbackReaderReader对象进行装饰,会增加一个行号。

5.InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream转变为Reader的方法。我们可以从这个类中得到一定的技巧。


4、字符输出流


Java 7之传统I/O第1篇- 输入输出流基础框架_第8张图片

在上面的关系图中可以看出:

1.Writer是所有的输出字符流的父类,它是一个抽象类。

2. CharArrayWriterStringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据。PipedWriter是向与其它线程共用的管道中写入数据,

3. BufferedWriter是一个装饰器为Writer提供缓冲功能。

4.PrintWriterPrintStream极其类似,功能和使用也非常相似。

5.OutputStreamWriterOutputStreamWriter转换的桥梁,它的子类FileWriter其实就是一个实现此功能的具体类(具体可以研究一下Source Code)。功能和使用和OutputStream极其类似,后面会有它们的对应图。


5、字节流与字符流的区别


1、Reader和Writer要解决的,最主要的问题就是国际化。原始的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集,这样加了Reader和Writer之后,所有的字节流都可以转换为字符流,也就都支持Unicode了。

2、使用字符处理要比字节处理的效率高。实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如下图所示。同时缓冲区也增加了操作字符的灵活性,例如可以读取当前位置的前一个字符等等...


所以说某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。 


         但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。 










参考文献:

1、深入分析Java Web技术内幕

2、http://blog.csdn.net/cynhafa/article/details/6882061


你可能感兴趣的:(Java,7,I/O源码)