java字节流对汉字输出为乱码的问题

package IoOut;
import java.io.*;
public class App14_1
{
public static void main(String args[]) throws IOException //read()方法抛出IOException异常,在此交给JVM处理
{
FileInputStream fr =new FileInputStream("c:\\aaa.txt"); //ok,但不能正 确读取出汉字
int ch;
int count=0;
ch=fr.read(); //read()方法返回的是一个整型数字
while(ch!=-1)
{
System.out.print((char)ch);
ch=fr.read();
count++;
}

fr.close();

System.out.println("\n共读取了:"+count+"个字符");
}
}
在aaa.txt中有汉字,但输出为乱码,字符输出正常,为什么?

出现问题的原因是字节流中每个汉字是两个字节,所以肯定会出现乱码的,要将字节流通过BufferedReader变成按行读取的就可以了。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环
{
System.out.println(str);//原样输出读到的内容
};
备注: 流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-15
首先确认你的字符编码,gbk编码中文是2个字节,utf编码是3个字节代表一个字符
read读到的是一个节,一个中文,当然就读半个字节了,不完全当然是乱码了本回答被提问者采纳
第2个回答  2011-10-27
txt 的字符是gb2312的 控制台 喷出的字符一般要经过转码 转成utf-8 就行了吧
第3个回答  2011-10-27
先请看我修改后的源代码:

package IoOut;

import java.io.*;

public class App14_1
{
public static void main(String args[]) throws IOException //read()方法抛出IOException异常,在此交给JVM处理
{
FileInputStream fr =new FileInputStream("c:\\aaa.txt"); //ok,但不能正 确读取出汉字
int ch;
int count=0;
ch=fr.read(); //read()方法返回的是一个整型数字
while(ch!=-1)
{
System.out.write(ch);
ch=fr.read();
count++;
}

fr.close();
System.out.println("\n共读取了:"+count+"个字符");
}
}

其实只改了一处地方,
System.out.print((char)ch);
改为
System.out.write(ch);
前者是按字符格式写,后者是按字节格式写。汉字、图片、音频等应该按字节处理,否则会出现所谓的乱码。
实际上没有所谓的乱码,只是不同Unicode编码组合表示的字符而已。
第4个回答  2011-10-28
热一天我也吧
相似回答