private String ReadFile(String path) {
try {
String str = "";
InputStreamReader in = new InputStreamReader(new FileInputStream(path), "GBK");
BufferedReader br = new BufferedReader(in);
//BufferedReader br = new BufferedReader(new FileReader(path)); //用这行读就出现乱码
StringBuilder sb = new StringBuilder();
while ((str = br.readLine()) != null) {
sb.append(str + "\n");
}
br.close();
in.close();
str = sb.toString();
return str;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
PATH 文件就是我在左面新建的文本文档
API:FileReader的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的,要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
所以就出现乱码了
它会按照默认的编码方式来读取。
至于默认的编码是什么编码,楼上人为是unicode,我人为应该是你操作系统的默认编码。
你过你的JVM是跑在中文版的windows系统上,那大多情况,默认编码都是GB2312编码。
如果你的JVM是跑在Unix系统下,那你不妨查查看,到底是什么编码。很显然,楼主所要读取的文件,其编码是GBK的,所以,指定其编码进行读取,就不会出现乱码情况了。
很多人会说UICODE啊,非也
这个时候采用的编码方式是JVM的默认字符集,这个默认字符集在虚拟机启动时决定,通常根据语言环境和底层操作系统的 charset 来确定。
楼主可以通过下面的小方法得到JVM的默认字符集,不一定就是UNICODE哦
Charset.defaultCharset();
OK ,开始分析你的问题
1.很显然你在用InputStreamReader in = new InputStreamReader(new FileInputStream(path), "GBK");这句的时候,你指定读取TXT文件的时候JVM采用GBK编码(也就是说这个时候JVM不用用它默认的编码方式了,而是采用你指定的GBK方式),因为txt文件也是GBK编码的,所以读出来没问题!
2.但是当你用BufferedReader br = new BufferedReader(new FileReader(path)); 这句的时候,你没有指定读取txt文件用什么编码,也就是说这个时候JVM会采用它默认的编码方式来读取这个txt文件,但是JVM默认是采用什么编码方式呢,就是我上面说的小方法啦。。我相信在楼主的机器上测试出来的JVM默认编码方式肯定不是GBK,要是GBK的话,那句就不会出错误了
说完了,应该明白了吧。其实我自己认为JAVA的编码方式是个很复杂的东东,所以我觉得5楼的兄弟认识的很清楚,再上面几楼对JAVA编码方式的理解就不敢恭维了
我认为这是这是BufferedReader采用的额是InputStreamReader的编码格式
我觉得问题就是处在lz的jvm编码格式上!!
我在我的机子上对一个txt文档读取了没有乱码!!
BufferedReader raf=new BufferedReader(new FileReader("Test1.txt"));
这句在我的机子上也可以读取正常!!
ApI中:
这么解释的:
FileReader的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的,要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。 这只能说明:你的默认编码符是:Unicode的或者其他编码的!而你的txt采用的gbk编码!!
因为你用哪种方式可以读取成功
你把你的文档保存为 ansi格式的