天天看點

IO流——轉換流(用于解決亂碼問題)

亂碼問題引入

文本檔案的編碼為

ANSI【國标碼,對應我國為 GBK】

,然後通過

BufferedReader

字元流讀取檔案。

package day06.codeQuestion;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 17:32 2021/9/3
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        // 要讀取的檔案
        String filePath = "E:\\news1.txt";

        // 1. 建立字元流 BufferedReader【處理流】
        // 2. 預設情況下,讀取檔案是按照 UTF-8 編碼方式
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));

        String line = bufferedReader.readLine();
        System.out.println("line = " + line);
        // 關閉流
        bufferedReader.close();
    }
}


           

由于預設情況下讀取檔案是按照

UTF-8

編碼讀取的,是以中文問題會有亂碼

IO流——轉換流(用于解決亂碼問題)

轉換流

InputStreamReader

OutputStreamWriter

介紹

  1. InputStreamReader

    Reader

    的子類,可以将

    InputStream

    (位元組流)包裝成(轉換)

    Reader

    (字元流)
  2. OutputStreamWriter

    Writer

    的子類,實作将

    OutputStream

    (位元組流)包裝成

    Writer

    (字元流)
  3. 當處理純文字資料時,如果使用字元流,效率更高,并且可以有效解決中文問題,是以建議将位元組流轉換成字元流
  4. 可以在使用時指定編碼格式(比如

    utf-8,gbk,gb2312,ISO8859-1

    等)
IO流——轉換流(用于解決亂碼問題)
IO流——轉換流(用于解決亂碼問題)

轉換流

InputStreamReader

練習

對開頭的亂碼問題進行優化:

将位元組流

FilelnputStream

包裝成(轉換成)字元流

InputStreamReader

,對檔案進行讀取(按照

utf-8/gbk

格式),進而再包裝成

BufferedReader

來提高讀取效率。

以上各類之間的關系如圖:

IO流——轉換流(用于解決亂碼問題)
package day06.codeQuestion;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @Author: Gin
 * @Description: 解決亂碼問題
 * @Modified By: Gin
 * @Date: Created in 19:45 2021/9/3
 */
public class Demo1 {
    public static void main(String[] args) throws IOException {

        // 要讀取的檔案
        String filePath = "E:\\news1.txt";

        // 1. 将 FileInputStream 包裝成(轉換成)InputStreamReader
        // 2. 指定編碼 GBK。指定的編碼要與檔案本身的編碼一緻
        // InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "GBK");

        // 3. 把 InputStreamReader 對象傳給 BufferedReader
        // BufferedReader br = new BufferedReader(isr);

        // 将以上 2 和 3 合并
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "GBK"));

        // 4. 讀取檔案
        String line = br.readLine();
        System.out.println("line = " + line);

        // 5. 關流
        br.close();

    }
}



           

輸出結果:

IO流——轉換流(用于解決亂碼問題)

轉換流

OutputStreamWrriter

練習

應用案例:

程式設計将位元組流

FileOutputStream

包裝成(轉換成)字元流

OutputStreamWriter

,對檔案進行寫入(按照

gbk

格式,可以指定其他,比如

utf-8

),這裡沒有用到 BufferedWriter。

package day06.codeQuestion;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/**
 * @Author: Gin
 * @Description: 轉換流 OutputStreamWrriter 練習
 * @Modified By: Gin
 * @Date: Created in 20:07 2021/9/3
 */
public class Demo2 {
    public static void main(String[] args) throws IOException {

        String filePath = "E:\\news5.txt";

        String charSet = "UTF-8";
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath, true), charSet);

        // BufferedWriter bw = new BufferedWriter(osw);
        // bw.write("Gin琴酒");
        // bw.close();

        osw.write("Gin琴酒");
        osw.close();

        System.out.println("按照 " + charSet + " 儲存檔案成功!");

    }
}


           
IO流——轉換流(用于解決亂碼問題)