Java IO--字符流--InputStreamReader 和 OutputStreamWriter

今天繼續學習字符流的子類!!!!java

先來熟悉一下適配器設計模式:(手寫的,,嘿嘿)設計模式

由於聽說InputStreamReader 和OutputStreamWriter採用了適配器模式(如今我還沒能理解,先記住)函數

1 InputStreamReader

是字節流轉換成字符流的橋樑,使用指定的Chartset將將從底層讀取的字節轉換成字符返回到程序中,使用的字符集能夠由名稱指定或顯示給定,或是默認字符集。本質使用其內部的一個類來完成全部工做:StreamDecoder、使用編碼將字節轉換成字符、InputStreamReader對StreamDecoder進行了封裝、isr內部全部方法核心都是調用StreamDecoder來完成的。學習

每次調用 InputStreamReader 中的一個 read() 方法都會致使從底層輸入流讀取一個或多個字節。要啓用從字節到字符的有效轉換,能夠提早從底層流讀取更多的字節,使其超過知足當前讀取操做所需的字節。編碼

爲了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如:spa

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

1.1類圖設計

1.2 構造函數code

  • InputStreamReader(InputStream in) 建立一個使用默認字符集的isr。
  • InputStreamReader(InputStream in, Chartset cs) 建立使用給定字符集的isr。
  • InputStreamReader(InputStream in, ChartsetDecoder dec) 建立使用給定字符集解碼器的isr。
  • InputStreamReader(InputStream in, String chartsetName) 建立使用指定字符集的isr。

1.3 代碼示例get

public static void InputStreamReaderTest() throws IOException{
		InputStream in = new FileInputStream("D:1.txt");
		InputStreamReader isDefault = new InputStreamReader(in);
		BufferedReader br = new BufferedReader(isDefault);
		System.out.println("isDefault encoding :" + isDefault.getEncoding() + "----content:" + br.readLine());
		if(in != null){
			in.close();
		}
		if(isDefault != null){
			isDefault.close();
		}
		if(br != null){
			br.close();
		}
	}

運行結果:it

把InputStreamReader isDefault = new InputStreamReader(in);

改爲:InputStreamReader isDefault = new InputStreamReader(in, ‘’UTF-8‘’);

運行結果:

2 OutputStreamWriter

字符流通向字節流的橋樑,每次調用 write() 方法都會致使在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流以前,獲得的這些字節將在緩衝區中累積。能夠指定此緩衝區的大小,不過,默認的緩衝區對多數用途來講已足夠大。注意,傳遞給 write() 方法的字符沒有緩衝。

爲了得到最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以免頻繁調用轉換器。例如:

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

2.2 構造函數

  • OutputStreamWriter(OutputStream out) 建立使用默認字符編碼的osw。
  • OutputStreamWriter(OutputStream out, Chartset cs) 建立使用給定字符集的osw。 
  • OutputStreamWriter(OutputStream out, CharsetEncoder enc) 建立使用給定字符集編碼器的osw。
  • OutputStreamWriter(OutputStream out) 建立使用指定字符集的osw。

2.3 代碼示例

public static void outputStreamWriterTest() throws IOException{
		OutputStream out = new FileOutputStream("D:1.txt", true);
		OutputStreamWriter osw1 = new OutputStreamWriter(out);//默認編碼
		BufferedWriter bfw1 = new BufferedWriter(osw1);
		bfw1.newLine();
		bfw1.write("我");
		
		OutputStreamWriter osw2 = new OutputStreamWriter(out, "GBK");//GBK編碼
		BufferedWriter bfw2 = new BufferedWriter(osw1);
		bfw2.newLine();
		bfw2.write("我");
		
		OutputStreamWriter osw3 = new OutputStreamWriter(out, "UTF-8");//UTF-8編碼
		BufferedWriter bfw3 = new BufferedWriter(osw1);
		bfw3.newLine();
		bfw3.write("我");
	
		bfw1.flush();
		bfw2.flush();
		bfw3.flush();

		bfw1.close();
		bfw2.close();
		bfw3.close();

		osw1.close();
		osw2.close();
		osw3.close();
		
		out.close();
	}

運行結果:

3 總結

OutputStreamWriter、InputStreamReader分別爲OutputStream、InputStream的低級輸入輸出流提供將字節轉換成字符(或將字符轉換成字節)的橋樑。

OutputStreamWriter中的StreamEncoder:

一、使用指定的或者默認的編碼集將字符轉碼爲字節

二、調用StreamEncoder自身實現的寫入方法將轉碼後的字節寫入到底層字節輸出流中。

InputStreamReader中的StreamDecoder:

一、使用指定的或者默認的編碼集將字節解碼爲字符

二、調用StreamDecoder自身實現的讀取方法將解碼後的字符讀取到程序中。

在理解這兩個流的時候要注意:java-io中只有將字節轉換成字符的類,沒有將字符轉換成字節的類,緣由很簡單——字符流的存在原本就像對字節流進行了裝飾、加工處理以便更方便的去使用。在使用這兩個流的時候要注意:因爲這兩個流要頻繁的對讀取或者寫入的字節或者字符進行轉碼、解碼和與底層流的源和目的地進行交互、因此使用的時候要使用BufferedWriter、BufferedReader進行包裝、以達到最高效率、和保護存儲介質。

相關文章
相關標籤/搜索