原文連結 作者: jakob jenkov 譯者: 李璟([email protected])
java io的reader和writer除了基于字元之外,其他方面都與inputstream和outputstream非常類似。他們被用于讀寫文本。inputstream和outputstream是基于位元組的,還記得嗎?
</h2>
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的子類,而不會直接使用reader。reader的子類包括inputstreamreader,chararrayreader,filereader等等。可以檢視java io概述浏覽完整的reader表格。
一個reader可以和一個inputstream相結合。如果你有一個inputstream輸入流,并且想從其中讀取字元,可以把這個inputstream包裝到inputstreamreader中。把inputstream傳遞到inputstreamreader的構造函數中:
在構造函數中可以指定解碼方式。更多内容請參閱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中實作緩沖。以下是例子: