java io流 分析
java io流 在java应用或者android应用中很常见,并且使用频率很高的一个模块。当时每次需要用到这个模块的时候总是有提笔忘字的感觉,不知道该用哪个流或者该用谁包装谁。
所以我就花了一点时间把这个块的结构梳理了一下。一是能让自己理清一下思路。二是以后如果还有提笔忘字的时候,看这篇文章就好了。
首先java io流分两大系统InputStream 和Reader,前者及其子类主要用于读取字节流,后者及其子类主要用于读取字符流。下面是InputSteram系的继承树
首先可以看InputStream类的结构,里面定义几个read方法,比如:
public abstract int read()
public int read(byte b[]) throws IOException
public int read(byte b[], int off, int len) throws IOException
其中后两个方法给出了具体实现,并且最终调用的都是第一个抽象方法。因此,第一个抽象方法才是核心。
那么我们再来看看InputStream的子类,其中FilterInputStream比较特别,这个类在构造
的时候需要传入一个InputStream对象。而里面read方法也是调用传入的InputStream对象来实现的,可以说这就是一个装饰类。而其他的四个子类FileInputStream,ByteArrayInputStream
PipedInputStream,ObjectInputStream.则是从不同的介质中读取数据,因此他们分别已自己特有的方法实现了
public abstract int read()这个抽象函数。
好了,下面说说Reader,reader系统是用来读取字符流的。
同样,Reader里面也定义了好几个read方法,最重要的被抽象了
abstract public int read(char cbuf[], int off, int len) throws IOException;
来看看Reader下面几个比较重要的子类。
Reader下面最重要的一个子类是InputStreamReader,这个类的构造方法需要一个InputStream对象,说明Reader还是要依赖InputStream读取的,然后再看看细节,发现是把InputStream
转成了StreamDecoder,而这个streamDecoder就可以按照指定的字符集来读取出char数组了。而FileReader集成InputStreamReader,其实只是加了一个构造方法,基本跟InputStream一样。
另外几类StringReader,CharArrayReader的构造方法分别传入的是String 和char数组,已经是有特定字符集了,所以不要再出入另外的reader对象了,而BuffedReader则需要传入另外的reader
来读取字符。
这里只是简单描述了一下inputStream 和 reader ,与之对应的outputStream,writer也是也是一样。