一、轉換流
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(); } } }