11.3.3.2 BufferedReader/BufferedWriter
在進行IO操作時,除了功能以外,程序的執行效率也是必須要考慮的問題。基本的IO類只是注重功能的實現,例如將特定的數據源轉換為流對象,而沒有過多的關注讀寫的效率問題,而實際在進行項目開發時,讀寫效率也是必須要考慮的問題。
為了提高IO類的讀寫效率,在裝飾流中專門制作了一類緩沖流,該類流的作用就是提高流的讀寫效率,這組緩沖流包含:BufferedInputStream/BufferedOutputStream、BufferedReader/BufferedWriter。
該部分以BufferedReader/BufferedWriter為基礎進行介紹。
由於前面介紹DataInputStream/DataOutputStream時,是以文件流作為實體流進行介紹,這裡就不再重復了,這裡以前面介紹的接收控制台輸入為基礎介紹緩沖輸入流的使用。
由於裝飾流在進行嵌套時,只能嵌套相同類型的流,例如InputStream類型的流之間可以嵌套,但是InputStream和Reader兩個體系之間的流就無法直接嵌套,為了使用新的IO類帶來的特性,在IO類中提供了兩個專門的類,實現體系之間的轉換,這兩個流類被形象的稱為“橋接流”。
橋接流主要包含2個,依次是:
1、InputStreamReader
該類實現將InputStream及其子類的對象轉換為Reader體系類的對象,實現將字節輸入流轉換為字符輸入流。
2、OutputStreamWriter
該類實現將OutputStream及其子類的對象轉換為Writer體系類的對象,實現將字節輸入流轉換為字符輸入流。
這兩個橋接流使得字節流可以被轉換為字符流,但是需要注意的是,字符流無法轉換為字節流。
在讀取控制台輸入時,直接使用System.in進行讀取,雖然在功能上可以實現,但是這種方式讀寫流的效率比較差,所以在實際使用時一般需要提高讀寫的效率,這就需要使用裝飾流中的緩沖流,這是一個典型的流的嵌套的示例。該代碼實現的功能是如果回顯用戶輸入,當用戶輸入quit時程序退出。該示例的代碼如下:
import java.io.*;
/**
* 使用BufferedReader讀取控制台輸入
*/
public class ReadConsoleWithBuffer {
public static void main(String[] args) {
BufferedReader br = null;
String s = null;
try{
//使用流的嵌套構造緩沖流
br = new BufferedReader(
new InputStreamReader(System.in));
do{
//輸出提示信息
System.out.println("請輸入:");
//按行讀取輸入
s = br.readLine();
//輸出用戶輸入
System.out.println(s);
}while(!s.equals("quit"));
}catch(Exception e){
e.printStackTrace();
}finally{
try{
br.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
在該示例代碼中,首先使用流的嵌套構建了BufferedReader類型的對象br,然後使用BufferedReader中的readLine方法,每次讀取用戶輸入的一行信息,使用readLine方法讀取內容時,系統以”\r\n”作為每次的結束符號,而且讀取的內容不包含”\r\n”,當讀取到流的末尾時readLine方法的返回值是null。然後使用do-while循環判斷用戶輸入的是否是quit,如果輸入的是quit,則程序結束,否則繼續下一次循環。
關於BufferedWriter的使用,沒有什麼特別的地方,這裡就不單獨舉例說明了。
11.3.3.3 裝飾流小結
前面介紹了兩類比較常見的裝飾流,在實際的開發中,根據邏輯的需要還可能會用到其它的裝飾流,這些裝飾流的使用和前面介紹的類類似,在實際使用時通過查閱JDK API文檔找到根據功能找到合適的裝飾流,然後進行使用即可。