java io流 分析
阿新 • • 發佈:2017-05-09
decode string 對象 集成 piped fileread 一個 blog 文章
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,ByteArrayInputStreamPipedInputStream,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也是也是一樣。
java io流 分析