8、IO流:轉換流

小青年&乖乖發表於2024-11-06

一、轉換流

1、引出問題:不同編碼讀取時會亂碼

(1)如果程式碼編碼和被讀取的文字檔案的編碼是一致的,使用字元流讀取文字檔案時不會出現亂碼!

(2)如果程式碼編碼和被讀取的文字檔案的編碼是不一致的,使用字元流讀取文字檔案時就會出現亂碼!

1.1、案例

(1)study18-io-app2/src/com/itheima/d3_transform_stream/Test1.java

package com.itheima.d3_transform_stream;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;

/**
 * 目標:掌握不同編碼讀取亂碼的問題
 */
public class Test1 {
    public static void main(String[] args) {

        try (
                // 1、建立一個檔案字元輸入流與原始檔截圖
                // 程式碼編碼:utf-8,檔案的編碼:utf-8
                Reader fr = new FileReader("study18-io-app2/src/itheima06.txt");
                // 2、把檔案字元輸入流包裝成緩衝字元輸入流
                BufferedReader br = new BufferedReader(fr);
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2、字元輸入轉換流

2.1、InputStreamReader(字元輸入轉換流)

(1)解決不同編碼時,字元流讀取文字內容亂碼的問題。

(2)解決思路:先獲取檔案的原始位元組流,再將其按真實的字符集編碼轉成字元輸入流,這樣字元輸入流中的字元就不亂碼了

2.1.1、案例

(1)study18-io-app2/src/com/itheima/d3_transform_stream/InputStreamReaderTest2.java

package com.itheima.d3_transform_stream;

import java.io.*;

/**
 * 目標:掌握字元輸入轉換流的作用
 */
public class InputStreamReaderTest2 {
    public static void main(String[] args) {
        try (
                // 1、得到檔案的原始位元組流(GBK的位元組流形式)
                InputStream is = new FileInputStream("study18-io-app2/src/itheima07.txt");
                // 2、把元素的位元組輸入流按照指定的字符集編碼轉換成字元輸入流
                Reader isr = new InputStreamReader(is, "GBK");
                // 3、把字元輸入流包裝成緩衝字元輸入流
                BufferedReader br = new BufferedReader(isr);
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

3、字元輸出轉換流

3.1、需要控制寫出去的字元使用什麼字符集編碼,該咋整?

(1)呼叫String提供的getBytes方法解決?

String data="我愛你中國abc";
byte[] bytes = data.getBytes("GBK");

(2)使用”字元輸出轉換流”實現。

3.2、OutputStreamWriter字元輸出轉換流

(1)作用:可以控制寫出去的字元使用什麼字符集編碼,

(2)解決思路:獲取位元組輸出流,再按照指定的字符集編碼將其轉換成字元輸出流,以後寫出去的字元就會用該字符集編碼了。

3.2.1、案例

(1)study18-io-app2/src/com/itheima/d3_transform_stream/OutputStreamWriterTest3.java

package com.itheima.d3_transform_stream;

import java.io.*;

/**
 * 目標:掌握字元輸出轉換流的使用
 */
public class OutputStreamWriterTest3 {
    public static void main(String[] args) {
        // 指定寫出去的字元編碼
        try ( // 放在小括號裡面的原因是自動完成資源的釋放
              // 1、建立一個檔案位元組輸出流
              OutputStream os = new FileOutputStream("study18-io-app2/src/itheima08out.txt");
              // 2、把原始的位元組輸出流,按照指定的字符集編碼轉換成字元輸出轉換流。
              Writer osw = new OutputStreamWriter(os, "utf-8");
              // 3、把字元輸出流包裝成緩衝字元輸出流
              BufferedWriter bw = new BufferedWriter(osw)
        ) {
            bw.write("我是這個人dada");
            bw.write("我是發射點發生這個人sdfs");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}