天天看點

Java IO: Reader And Writer

java io的reader和writer除了基于字元之外,其他方面都與inputstream和outputstream非常類似。他們被用于讀寫文本。inputstream和outputstream是基于位元組的,還記得嗎?

reader類是java io中所有reader的基類。子類包括bufferedreader,pushbackreader,inputstreamreader,stringreader和其他reader。

這是一個簡單的java io reader的例子:

請注意,inputstream的read()方法傳回一個位元組,意味着這個傳回值的範圍在0到255之間(當達到流末尾時,傳回-1),reader的read()方法傳回一個字元,意味着這個傳回值的範圍在0到65535之間(當達到流末尾時,同樣傳回-1)。這并不意味着reade隻會從資料源中一次讀取2個位元組,reader會根據文本的編碼,一次讀取一個或者多個位元組。

一個reader可以和一個inputstream相結合。如果你有一個inputstream輸入流,并且想從其中讀取字元,可以把這個inputstream包裝到inputstreamreader中。把inputstream傳遞到inputstreamreader的構造函數中:

writer類是java io中所有writer的基類。子類包括bufferedwriter和printwriter等等。這是一個java io writer的例子:

同樣,你最好使用writer的子類,不需要直接使用writer,因為子類的實作更加明确,更能表現你的意圖。常用子類包括outputstreamwriter,chararraywriter,filewriter等。writer的write(int c)方法,會将傳入參數的低16位寫入到writer中,忽略高16位的資料。

與reader和inputstream類似,一個writer可以和一個outputstream相結合。把outputstream包裝到outputstreamwriter中,所有寫入到outputstreamwriter的字元都将會傳遞給outputstream。這是一個outputstreamwriter的例子:

writer writer = new outputstreamwriter(outputstream);

和位元組流一樣,reader和writer可以互相結合實作更多更有趣的io,工作原理和把reader與inputstream或者writer與outputstream相結合類似。舉個栗子,可以通過将reader包裝到bufferedreader、writer包裝到bufferedwriter中實作緩沖。以下是例子: