java中用字节流读取文本时中文乱码
生活随笔
收集整理的這篇文章主要介紹了
java中用字节流读取文本时中文乱码
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
字節(jié)流可以讀取任何文件,視頻流;音頻流都可以;
字符流只能讀取字符;
? ? ?說(shuō)明:一般的漢字是2個(gè)字節(jié),而英語(yǔ)字母是1個(gè)字節(jié),如果用字節(jié)流讀取中文,一個(gè)字節(jié)一個(gè)字節(jié)的輸出,容易把中文漢字截?cái)?#xff0c;建議用字符流讀取;
import?Java.io.*;
public class Test8
{
/*
* ==>本java文件采用的編碼(GBK)讀取GBK編碼文本,
*?
* 實(shí)現(xiàn)思路:
*? 1.因?yàn)樵揵yte數(shù)組只存5個(gè)元素,為單.而判斷中文包含兩個(gè)字節(jié),會(huì)勝下一個(gè)元素.
*? 2.兩個(gè)字節(jié)判斷,如果第一個(gè)為中文的一個(gè)字節(jié),那么后面的一個(gè)也必定為中文的一個(gè)字節(jié),兩個(gè)字節(jié)合成一個(gè)中文
*? 3.如果第一個(gè)不為中文的一個(gè)字節(jié),則第二個(gè)可以是,也可能不是,兩個(gè)都不為中文的字節(jié),則輸出兩個(gè)字符,
*? 4.如果兩個(gè)字節(jié)前一個(gè)不為中文的一個(gè)字節(jié)后一個(gè)是,則把前一個(gè)輸出,然后continue,這時(shí)如果這兩個(gè)字節(jié)中的后一個(gè)字節(jié)是byte數(shù)組中的最后一個(gè)元素,則補(bǔ)充一個(gè)
*? 5.否則不用補(bǔ)充,只把i多加1(i++)for也有個(gè)i++,這樣就會(huì)多跳過(guò)一個(gè)元素,從而又是數(shù)組中兩個(gè)新的字節(jié)去進(jìn)行判斷,再一次進(jìn)入while
*?
*?
*/
public static void main(String[] args)
{
// 調(diào)用方法
reader();
}
public static void reader()
{
// 封裝文件
File file = new File("exercise.txt");
try
{
// 創(chuàng)建文件讀取流,通過(guò)字節(jié)流讀取
FileInputStream fs = new FileInputStream(file);
// 聲明長(zhǎng)度為5的byte數(shù)組
byte[] b = new byte[5];
// 聲明len變量,用于存儲(chǔ)read()方法讀取的字節(jié)個(gè)數(shù),還有其它作用
int len;
// 聲明兩個(gè)int變量分別代表byte數(shù)組中的兩個(gè)元素(轉(zhuǎn)換成int型)
int param1;
int param2;
// 使用while循環(huán)讀取文本文件
while ((len = fs.read(b)) != -1)
{
// for循環(huán)用于循環(huán)讀取數(shù)組中的元素,因?yàn)橛锌梢允?有可能最后read()方法讀入到byte數(shù)組中的不到5個(gè)元素,所以用len作為一個(gè)判斷條件
for (int i = 0; i < len; i++)
{
// 因?yàn)槿绻嫒隻yte數(shù)組中的元素是單數(shù),所以最后會(huì)勝下一個(gè)元素,它的元素下標(biāo)為:i=len-1
if (i == len - 1)
{
// 每一次while循環(huán)的得到的byte數(shù)組的最后一個(gè)元素.
param1 = b[i];
// 如果該元素非漢字
if (param1 >= 0 && param1 <= 127)
{
// 打印該字符
System.out.print((char) param1);
}
else
// 否則為中文的一個(gè)字節(jié)
{
// 補(bǔ)充讀取一個(gè)字節(jié)
len = fs.read();
if (len == -1)
{
return;
}
// 打印這兩個(gè)字節(jié),也就是中文
System.out.print(new String(new byte[]{
(byte) param1, (byte) len }));
}
// byte數(shù)組中最后一個(gè)元素的兩種情況判斷完,break;
break;
}
// while循環(huán)開(kāi)始后最先執(zhí)行的代碼
param1 = b[i];
param2 = b[i + 1];
// 如果第一個(gè)元素param1不為中文的一個(gè)字節(jié),那么就可能為兩個(gè)非中文的字節(jié),也有可能后一個(gè)元素param2為中文的一個(gè)字節(jié),
if ((param1 >= 0 && param1 <= 127)// 如果param1非中文的一個(gè)字節(jié)
&& (param2 > 127 || param2 < 0))// 如果param2是中文的一個(gè)字節(jié)
{
// 打印并跳出當(dāng)前循環(huán),進(jìn)行下一次循環(huán)
System.out.print((char) param1);
continue;
}
//兩個(gè)字節(jié)都為中文或兩個(gè)都不為中文字節(jié).
String str = new String(new byte[]{b[i], b[i + 1] });
System.out.print(str);
i++;//打印的是兩個(gè)字節(jié),i要多加1(用于上面for循環(huán))
}
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java中用字节流读取文本时中文乱码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: eclipse上安装hadoop后报错
- 下一篇: Hadoop之HDFS文件操作