沧海田园

 

关于Java I/O操作结构分析

IO按照每次读入的字节数,由于Unicode文件格式的问题,可以分为InputStream/OutputStream和Reader/Writer两大类

。InputStream/OutputStream是每次读取一个字节的数据,Reader/Writer是针对Unicode数据格式,每次读取两个字节数据。
查看JDK的API文档和其源码可以看到:
InputStream是一个抽象类,并且他实现了Closeable接口,源码如下:public abstract class InputStream implements Closeable{}
OutputStream也是一个抽象类,实现了Closeable和Flushable接口,源码如下:public abstract class OutputStream implements Closeable, Flushable{}
Reader也是一个抽象类,实现了Closeable和Readable接口,源码如下:public abstract class Reader implements Readable, Closeable{}
Writer同样也是一个抽象类,实现了Appendable Closeable和Flushable接口,源码如下:public abstract class Writer implements Appendable, Closeable, Flushable{}

可以很明显的看到上面都实现了Closeable接口,这儿接口主要作用是:Closeable是一种可以被关闭的,指向源地址或目的地址的数据。简单说,Closeable也是一种数据,只是这种数据可以被关闭,所有实现了这个接口的类,他们的数据流都可以被人为的关闭。这个接口有唯一一个方法:public void close() throws IOException。这个方法一旦被调用,将会关闭相应的输入输出流,并且会释放掉所有给这个流有关的系统资源。如果这个流已经关闭,则本次关闭,将不起作用。

由上面可知,所有继承于InputStream、OutputStream、Reader和Writer的类都具有一个close方法,用来人为的关闭对应的流,并且释放掉他们所占用的系统资源。

比较上面可知:InputStream和Reader的不同是,Reader实现了Readable接口,而InputStream没有。为什么同时读入流,而却实现不同呢。通过查看Reader的源码可以发现,他是一个lang下面的接口,只有一个方法public int read(java.nio.CharBuffer cb) throws IOException。再去查看InputStream源码发现,他里面定义了一个抽象的Reader方法:public abstract int read() throws IOException。很明显的是一个有参数,一个没有参数,通过分析发现。Reader实现的reader方法,有一个基于NIO的缓冲区,就是说,Reader会把读取出来的数据放到CharBuffer中,返回放到charbuffer中的字节数,或者-1;而InputStream的reader方法,则会把数据从输入流中读取出来,放到另一个可以操作的流中,返回对应的字节编码(0-255)或者-1(表示结尾),每次读取一个字节。他们在读取的过程中,都会进行block(阻塞)。因此可以知道,InputStream和Reader的主要区别是:数据读取之后要不要进行缓存存放。

OutputStream和Writer都又实现了另外一个接口Flushable。Flushable接口的意思就是排水管的意思,在java中的意思是进行数据流的强制刷新,把数据强制流向下一个流。由于java中写入文件的时候,有一个默认包大小,当达到这个包大小的时候才继续写入操作,但是如果没有达到这个包大小,那么就永远不会进行写入操作,这部分数据就可能流失。因此才有了Flush方法,进行强制写入,不管是不是达到包大小。

第一次发表博客,见解太肤浅,以后会逐步改进的。欢迎指教。

posted on 2012-09-27 16:04  沧海田园  阅读(320)  评论(0编辑  收藏  举报

导航