不要以为字符流读取文本(含有中文) 就不会有任何问题,如果你写(存)的编码和取(读)的编码不一致的话,其实也会造成乱码的现象这就跟我上次讲的那个String的编码和解码的问题是一样的,你存的时候用的UTF-8,你读的时候必须也用UTF-8,不要管它中间干了吗,只看头和尾的编码格式是否一致,接下来使用案例说明一下
案例一:读取一个文本(含中文)
准备工作
上述文件,我现在是使用UTF-8存储的,但是存储完之后,我将它的打开方式改为GBK (右键properties 改成GBK编码)
1.1:使用FileReader来读:存入和取出的编码一致
package crazy.java;
import java.io.FileReader;
public class Demo4 {
public static void main(String[] args) throws Exception {
//存的时候是UTF,那你就得用UTF解,不能用GBK
FileReader fr = new FileReader("wzj");
String encoding = fr.getEncoding();//本文件的编码格式
System.out.println(encoding);
char[] cbuf = new char[4];
int len;
while((len = fr.read(cbuf)) != -1) {
System.out.print(new String(cbuf, 0, len));
}
fr.close();
}
}
控制台输出结果:
有的人可能会拿GBK来解,因为他看到那个文件的格式是GBK的(因为后来被我们手动改了),他心想只要两边编码一致就行了
可是却不知道,已经误解了一段话的意思,两边编码一致是指存入的编码和取出编码的时候,不管中间做了什么干扰都不要管,这里存入的时候,就是UTF-8, 只不过中间的编码的打开方式变化了,让我们误以为编码就被改了
1.2 使用FileReader来读:存入和取出的编码不一致
我把取出这边文件的编码改成GBK(右键,properties),取出的文件,就代表运行程序的这个文件
还是上面的代码,控制台输出效果
1.3 使用InputStreamReader来读(推荐)
因为使用FileReader来读的话, 如果想改取出的编码,还得右键properties,改编码,这倒 不麻烦
重要的是可能你之前写的中文注释,都会变成乱码,这样会得不偿失!!所以推荐使用InputStreamReader来读,
InputStreamReader,是Reader 的子类, 看它后面的Reader就知道了
构造方法:可以灵活的指定取出的编码!!
InputStreamReader(InputStream in, String charsetName) |
代码:
/**
* 编码问题:
* 它写的时候是什么编码,你读的时候就用什么编码,你不要它管中间是如何干扰的
*
* @author 1
*
*/
public class Demo3 {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("wzj"),"GBk");
System.out.println(isr.getEncoding());
char[] cbuf = new char[1024];
int len;
while((len = isr.read(cbuf)) != -1) {
System.out.print(new String(cbuf, 0, len));
}
isr.close();
}
}
1.控制台输出:
这是因为存入的时候是UTF-8,而我代码中取出来却使用的是GBK,所以导致乱码!!!
2. 我将代码中取出来改成UTF-8,这样就存入和取出的编码一致了,就不会乱码了
控制台输出:
最后有什么写的不好的,希望各位可以不吝指出
觉得对你有帮助的,想打赏的可以打赏一下,哈哈哈,多少无所谓,这也是对我一种支持与鼓励吗,最后不喜勿喷
有志同道合的小伙伴可以加QQ群讨论:897992110