字符流
輸入輸出操作通過字節(jié)流就可以實現(xiàn),為什么需要字符流呢?
這是因為,同其它許多程序設計語言使用ASCII字符集不同,JAVA使用Unicode
編碼表示字符。
ASCII符集是以一個字節(jié)(8比特)表示一個字符,所以可以認為一個字符就是一個字節(jié)。但Unicode編碼是用兩個字節(jié)(16比特)表示一個字符,這時字節(jié)與字符就不一樣了。
為了實現(xiàn)與其他程序語言及不同平臺之間交互,Java提供16位的數(shù)據(jù)流處理方案。
字符流也分為輸入字符流和輸出字符流,分別對應Reader和Writer。
和InputStream類和OutputStream類一樣,Reader和Writer也是抽象類。編程時根據(jù)需要,選擇子類生成對象。
Reader類
Reader類提供了多個從字符輸入流中讀取字符的方法:
- public int read() ;
該方法讀取一個字符,返回范圍在0和65535之間的int值。如果達到了
輸入流的末尾,則返回‐1。
- public int read(char [] cbuf) ;
該方法與InputStream的read方法類似,不同的是,參數(shù)中的數(shù)組不再是
byte數(shù)組,而是char數(shù)組。
• public int read(char [] cbuf, int off, int len) ;
該方法讀取 len 個字符,存儲到字符數(shù)組從 off 開始的位置中。
Reader作為抽象類,有多個非抽象的子類,其中最常用的包括 FileReader、BufferedReader
等等。
FileReader類從InputStreamReader類繼承而來。該類按字符讀取流中數(shù)據(jù)。
FileReader類中讀取字符流的方法如下表所示:
FileReader類并未包含從文件中讀取一行的方法。
而在讀取純文本文件時,按行讀取是開發(fā)人員最常用的方法。
而BufferedReader類則彌補了這一缺憾,該類包含了下列方法:
- public String readLine() throws IOException
readLine方法讀取一個文本行。通過下列字符之一即可認為某行已終止:
換行 (‘n’)、回車 (‘r’) 或回車后直接跟著換行。方法返回包含該行內容的字符串,不包含任何行終止符,如果已到達流末尾,則返回 null。
BufferedReader類的readLine方法可能是讀取純文本文件時最常用的方法。
如果想從純文本文件中按行讀取內容,很顯然,把BufferedReader與FileReader兩個類結合使用是很直觀的一種想法。
而BufferedReader確實也提供了下列構造方法:
public BufferedReader(Reader in)
該構造方法創(chuàng)建一個使用默認大小輸入緩沖區(qū)的緩沖字符輸入流。
因此,可以通過如下代碼來結合使用上述兩個類:
BufferedReader br = new BufferedReader(new FileReader(“d.txt"));
在Java 輸入輸出處理編程中,上述多個類的結合使用編程方式非常常見。這種方式,使用
了設計模式中的裝飾模式。
在上述代碼中,對創(chuàng)建得到的 FileReader 對象使用 BufferedReader對象進行了裝飾和增強,從而可以對已有的 FileReader 對象來調用readLine 這個FileReader 類并沒有定義的方法。
- 裝飾設計模式的特點是,裝飾類與被裝飾類都必須所屬同一個接口或父類。
Writer類
Writer類的主要方法包括:
public void write(String str);
public void write(String str, int off, int len);
public void close();
public void flush();
文件處理
- File類是java.io包中唯一代表磁盤文件的對象,F(xiàn)ile類定義了一些與平臺無關的方法。
- 通過調用File類的各種方法,能夠實現(xiàn)創(chuàng)建、刪除、重命名文件等操作。
- 需要注意的是,F(xiàn)ile類不僅僅代表文件,也可以用來表示文件夾。
File的構造方法
File的方法