IO之字元流

2021-06-20 02:36:40 字數 3799 閱讀 7835

字元流以16位的字元為單位進行讀與寫操作。其體系都是以reader和writer為基類派生出來。這兩個類是抽象類,作為字元流的模版。

1.writer和filewriter

1.1 writer

writer是寫入字元流的抽象類。

其用於寫的方法有如下幾個:

void write(char c):寫入單個字元。

void write(char cbuf):寫入字元陣列。

void write(char cbuf, int off, int len):寫入字元陣列的某一部分。

void write(string str):寫入字串。

void write(string str,int off, int len):寫入字串的某一部分。

可見,寫入方法可以寫單個字元、字元陣列和字串。

將字串轉換為字元陣列可以使用string類的tochararray()方法。

除了寫的幾個過載方法,還有以下幾個方法:

void flush():重新整理該流的緩衝。將流中的字元寫入到目的地。

void close():關閉此流,但要先重新整理它。

注:如果只呼叫write方法而沒有呼叫flush或close方法,那麼不會寫入目標檔案;如果呼叫write方法,沒有呼叫flush方法,那麼呼叫close方法關閉流,也會將字元寫入到目標檔案;如果多次呼叫write和flush,不會將檔案中原內容覆蓋,而是會在其後寫入。

1.2 filewriter

filewriter是writer的實現類,是用來寫入字元檔案的便捷類。

構造器:

filewriter(string filename):根據給定的檔名構造乙個 filewriter 物件。如果已存在該檔案,則會覆蓋。

filewriter(file file):根據給定的 file 物件構造乙個 filewriter 物件。

注意:如果要換行,那麼在windows作業系統中使用"\r\n",在linux系統使用「\n」。

見下面程式(在使用輸入輸出類的方法中,有許多方法會丟擲異常,這裡為了方便學習與檢視,沒有將異常處理而是丟擲,後面會有詳細的異常處理)

public class filewriterdemo ;

fw.write(cbuf);

fw.write("\r\n");

fw.flush();

//寫乙個字串

fw.write("hello");

fw.flush();

//關閉流

fw.close();

}}

2.reader和filereader

2.1 reader

reader是用於讀取字元流的抽象類。

其中用於讀的方法有:

int read():讀取單個字元。返回值是作為整數讀取的字元,範圍在 0 到 65535 之間 (0x00-0xffff),如果已到達流的末尾,則返回 -1。

將返回的字元輸出時,需要進行強轉(char)操作。

int read(char cbuf):將字元讀入陣列。返回值是讀取的字元數,如果已到達流的末尾,則返回 -1 。

int read(char cbuf, int off, int len):將字元讀入陣列的某一部分。返回值是讀取的字元數,如果已到達流的末尾,則返回 -1 。

可見,是否讀到檔案的末尾只要判斷返回值是否為-1即可。

2.2 filereader

filereader是reader的實現類。是用來讀取字元檔案的便捷類。

構造器:

filereader(string filename): 在給定從中讀取資料的檔名的情況下建立乙個新filereader。

filereader(file file):在給定從中讀取資料的file的情況下建立乙個新filereader。

filereader使用的是預設編碼表,無法改變指定編碼表。

見下面程式

public class filereaderdemo 

//使用讀單個字元的方法

public static void readbychar()throws ioexception }

//使用讀字元陣列的方法

public static void readbychararray()throws ioexception

}}

3.bufferedreader和bufferedwriter

bufferedreader和bufferedwriter是帶有緩衝的字元流。

3.1 bufferedreader

從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。

通常,reader 所作的每個讀取請求都會導致對底層字元或位元組流進行相應的讀取請求。因此,建議用 bufferedreader 包裝所有其 read() 操作可能開銷很高的 reader(如 filereader 和 inputstreamreader)。

構造器:

bufferedreader(reader in):建立乙個使用預設大小輸入緩衝區的緩衝字元輸入流。

方法:string readline():讀取乙個文字行。通過下列字元之一即可認為某行已終止:換行 ('\n')、回車 ('\r') 或回車後直接跟著換行。返回值是包含該行內容的字串,不包含任何行終止符,如果已到達流末尾,則返回 null。

即該方法判斷是否讀到檔案末尾只要判斷返回值是否為null。

close():關閉該流並釋放與之關聯的所有資源。只需手動將帶有快取的字元流關閉即可,因為底層會將被包裝的字元流關閉。

public class bufferedreaderdemo 

//只需要將帶快取的字元流關閉即可

bufr.close();

}}

3.2 bufferedwriter

將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入。

通常 writer 將其輸出立即傳送到底層字元或位元組流。除非要求提示輸出,否則建議用 bufferedwriter 包裝所有其 write() 操作可能開銷很高的 writer(如 filewriters 和 outputstreamwriters)。

構造器:

bufferedwriter(writer writer):建立乙個使用預設大小輸出緩衝區的緩衝字元輸出流。

方法:void newline():寫入乙個行分隔符。在不同系統,可以都呼叫這個方法來換行,而不必在使用特定平台的轉義字元。

close():關閉此流,但要先重新整理它。只需手動將帶有快取的字元流關閉即可,因為底層會將被包裝的字元流關閉。

public class bufferedwriterdemo 

}

4.linenumberreader

linenumberreader繼承了bufferedreader。linenumberreader是跟蹤行號的緩衝字元輸入流。此類定義了方法 setlinenumber(int) 和 getlinenumber(),它們可分別用於設定和獲取當前行號。

public class linenumberreaderdemo 

}catch(ioexception e)finallycatch(ioexception e)

} }}

IO流之字元流

字元流是為了方便我們讀寫文字檔案,在換句話說,字元流只能讀寫文字檔案,其他型別的檔案讀寫不了。outputstreamwriter 是字元流通向位元組流的橋梁 可使用指定的 charset 將要寫入流中的字元編碼成位元組。它使用的字符集可以由名稱指定或顯式給定,否則將接受平台預設的字符集。使用編碼表...

IO流之字元流

字元流產生的原因 1.每次只能夠讀取乙個位元組或者乙個位元組陣列,每次在需要轉換成字元或者字串的時候不是很方便 2.不同的作業系統針對換行符的處理不方便 3.有的時候會出現中文亂碼 中文佔兩個位元組,如果針對中文中某個位元組做了轉換或者顯示,就會出現亂碼 4.如果需要讀取某一行資料,非常不方便 編碼...

IO之字元流

在程式中乙個字元等於兩個位元組。1 字元輸出流 writer 抽象類,需要通過filewriter子類進行例項化 public filewriter file file throws ioexcrption writer類的常用方法 public abstract void close 0 thro...