1. 程式人生 > >Java IO流 筆記5 --- 轉換流

Java IO流 筆記5 --- 轉換流

Reader Writer 最重要的子類是 InputStreamReaderOutputStreamWriter 類  --- Java 網路程式設計

InputStreamReader : 讀 --- 讀取原始位元組,將位元組轉為字元。

包含了一個底層輸入流,可以從中讀取原始位元組。它根據指定的編碼方式,將這些位元組轉換為Unicode字元

OutputStreamWriter :寫 --- 將字元轉為位元組,寫入 底層輸出流中

從執行的程式中接收Unicode字元,然後使用指定的編碼方式將這些字元轉換為位元組,再將這些位元組寫入底層輸出流中

轉換流的特點

  1. 其是字元流和位元組流之間的橋樑
  2. 可對讀取到的位元組資料經過指定編碼轉換成字元
  3. 可對讀取到的字元資料經過指定編碼轉換成位元組

什麼時候使用轉換流:

源或者目的對應的裝置是位元組流,但是操作的卻是文字資料,可以使用轉換作為橋樑。提高對文字操作的便捷 參見示例1-1 1-2

一旦操作文字涉及到具體的指定編碼表時,必須使用轉換流 。參見示例2-1 2-2

具體的物件體現:

  1. InputStreamReader:位元組到字元的橋樑
  2. OutputStreamWriter:字元到位元組的橋樑

這兩個流物件是字元體系中的成員,它們有轉換作用,本身又是字元流,所以在構造的時候需要傳入位元組流物件進來

示例1-1:位元組流System.in轉為字元流BufferedReader

讀取鍵盤輸入的每一行內容,並寫入到文字中,直到遇到over行結束輸入

public static void main(String[] args) throws IOException {
        //位元組流-->字元流
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new FileWriter("is2.txt"));
        String line = null;
        while((line = br.readLine())!=null){
            if("over".equals(line)){
                break;
            }

            bw.write(line);
            bw.newLine();
            bw.flush();         
        }

        bw.close();
        br.close();
    }

例項1-2 字元流BufferedReader轉為位元組流System.out

public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new FileReader("is2.txt"));
        //字元流-->位元組流      
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String line = null;
        while ((line = br.readLine())!=null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        bw.close();
        br.close();
    }

示例2-1 採用指定的編碼讀取文字檔案

public static void main(String[] args) throws IOException {
		//在IO流中,如果想指定編碼讀寫資料,只能使用轉換流。
		//採用指定編碼從文字檔案中讀取內容

		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\a.txt"), "UTF-8"));
		String line = null;

		while ((line=br.readLine())!=null) {
			System.out.println(line);
		}
		br.close();
	}

例項2-2 採用指定的編碼輸出文字檔案

public static void main(String[] args) throws IOException {
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
				new FileOutputStream("C:\\a.txt"), "UTF-8"));

		bw.write("I am 君山");
		bw.close();
}