1.問題
例如:文件中有"張三a好好學習"內容,使用字節流讀取的時候,UTF-8漢字占3個字(例:[-32,-43,-32]),而字母“a”(例:[97])占一個字節,使用編輯器打開查看的時候,因為97和后面漢字"好"([-32,-54,-12])的前兩個字節拼在了一起,導致亂碼,字節流無法保證,每次讀取到的是一個字符/多個字符對應的完整的字節內容,容易出現亂碼。
2.解決方案
使用字符流讀取,可以 保證每次讀取到的是一個字符/多個字符對應的完整的字節內容,詳見字符流讀取文件。
3.示例代碼
/* 字節流讀取中文的問題? 字節流無法保證,每次讀取到的是一個字符/多個字符對應的完整的字節內容,容易出現亂碼 解決方案: 字符流: 保證每次讀取到的是一個字符/多個字符對應的完整的字節內容 中文windows操作系統,默認編碼表: GBK GBK: 一個漢字占2個字節 IDEA默認編碼表: UTF-8 UTF-8: 一個漢字占3個字節 如何獲取String對應的字節數組? String類的成員方法 public byte[] getBytes(): 根據平台默認編碼表(IDEA默認編碼表: UTF-8),獲取String的字節數組 你好 的UTF-8編碼: [-28, -67, -96, -27, -91, -67] 你好a 的UTF-8編碼: [-28, -67, -96, -27, -91, -67, 97 ..... */ public class Demo02InputStreamProblems { public static void main(String[] args) throws IOException { byte[] bs1 = "你好".getBytes();//字符串"你好"的UTF-8編碼 //System.out.println("你好 的UTF-8編碼: "+ Arrays.toString(bs1)); FileInputStream fis = new FileInputStream("day11\\02_代碼\\day11\\src\\fis3.txt");//你好a哈哈哈 /*int b = 0; while((b = fis.read())!=-1) { System.out.println((char)b); }*/ int len = 0; byte[] bs = new byte[3]; while((len = fis.read(bs))!=-1) { System.out.print(new String(bs,0,len));//你好#¥#%……# } fis.close(); } }