_148_Java_java中用位元組流讀取文字時中文亂碼
阿新 • • 發佈:2018-12-13
注:編寫的程式碼和讀取的文字字元編碼要一致.無論緩衝的byte[]長度是多少都可以讀取
複製以下程式碼,設定要讀取的文字,可以直接執行.
import java.io.*; public class Test8 { /* * ==>本java檔案採用的編碼(GBK)讀取GBK編碼文字, * * 實現思路: * 1.因為該byte陣列只存5個元素,為單.而判斷中文包含兩個位元組,會勝下一個元素. * 2.兩個位元組判斷,如果第一個為中文的一個位元組,那麼後面的一個也必定為中文的一個位元組,兩個位元組合成一箇中文 * 3.如果第一個不為中文的一個位元組,則第二個可以是,也可能不是,兩個都不為中文的位元組,則輸出兩個字元, * 4.如果兩個位元組前一個不為中文的一個位元組後一個是,則把前一個輸出,然後continue,這時如果這兩個位元組中的後一個位元組是byte陣列中的最後一個元素,則補充一個 * 5.否則不用補充,只把i多加1(i++)for也有個i++,這樣就會多跳過一個元素,從而又是陣列中兩個新的位元組去進行判斷,再一次進入while * * */ public static void main(String[] args) { // 呼叫方法 reader(); } public static void reader() { // 封裝檔案 File file = new File("exercise.txt"); try { // 建立檔案讀取流,通過位元組流讀取 FileInputStream fs = new FileInputStream(file); // 宣告長度為5的byte陣列 byte[] b = new byte[5]; // 宣告len變數,用於儲存read()方法讀取的位元組個數,還有其它作用 int len; // 宣告兩個int變數分別代表byte陣列中的兩個元素(轉換成int型) int param1; int param2; // 使用while迴圈讀取文字檔案 while ((len = fs.read(b)) != -1) { // for迴圈用於迴圈讀取陣列中的元素,因為有可以是5有可能最後read()方法讀入到byte陣列中的不到5個元素,所以用len作為一個判斷條件 for (int i = 0; i < len; i++) { // 因為如果存入byte陣列中的元素是單數,所以最後會勝下一個元素,它的元素下標為:i=len-1 if (i == len - 1) { // 每一次while迴圈的得到的byte陣列的最後一個元素. param1 = b[i]; // 如果該元素非漢字 if (param1 >= 0 && param1 <= 127) { // 列印該字元 System.out.print((char) param1); } else // 否則為中文的一個位元組 { // 補充讀取一個位元組 len = fs.read(); if (len == -1) { return; } // 列印這兩個位元組,也就是中文 System.out.print(new String(new byte[]{ (byte) param1, (byte) len })); } // byte陣列中最後一個元素的兩種情況判斷完,break; break; } // while迴圈開始後最先執行的程式碼 param1 = b[i]; param2 = b[i + 1]; // 如果第一個元素param1不為中文的一個位元組,那麼就可能為兩個非中文的位元組,也有可能後一個元素param2為中文的一個位元組, if ((param1 >= 0 && param1 <= 127)// 如果param1非中文的一個位元組 && (param2 > 127 || param2 < 0))// 如果param2是中文的一個位元組 { // 列印並跳出當前迴圈,進行下一次迴圈 System.out.print((char) param1); continue; } //兩個位元組都為中文或兩個都不為中文位元組. String str = new String(new byte[]{b[i], b[i + 1] }); System.out.print(str); i++;//列印的是兩個位元組,i要多加1(用於上面for迴圈) } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }