1. 程式人生 > >_148_Java_java中用位元組流讀取文字時中文亂碼

_148_Java_java中用位元組流讀取文字時中文亂碼

注:編寫的程式碼和讀取的文字字元編碼要一致.無論緩衝的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();
}
}
}