使用字节流读取中文的问题---会出现各种各样的错误,一定要注意各种编码占用的字节
实现文件的复制都是都过字节流的形式复制的,也就是说在操作系统调用写入获取方法时候,只认识字节流
字节流显然不符合中文等一些语言的实际场景,比如1个中文
GBK:占用两个字节
UTF-8:占用3个字节
使用字节流读取中文文件,读取字母没啥问题,一旦是中文必然是乱码
先看一段代码一
package com.baidu.字节输入输出流;
import java.io.FileInputStream;
import java.io.IOException;
public class InputStream04 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("F:\\develop\\e.txt");
int len = 0;
while ((len=fis.read())!=-1){
System.out.println(len);
}
fis.close();
}
}
输出结果:
239
187
191
228
189
160
229
165
189
代码二
package com.baidu.字节输入输出流;
import java.io.FileInputStream;
import java.io.IOException;
public class InputStream04 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("F:\\develop\\f.txt");
int len = 0;
while ((len=fis.read())!=-1){
System.out.println(len);
}
fis.close();
}
}
输出结果:
196
227
186
195
可以发现两段代码除了构造方法中指定的文件路径不一致外,其他代码都是一致的,
而e.txt和f.txt中的内容都是“你好”,可是打印的结果为什么不同呢?
答:编码不同导致的,e.txt用的是utf-8编码,3个数字为一组,“228 189 160” 转为中文是“你”,“229 165 189”转换为中文是“好”
至于前面的“239 187 191”代表UTF-8的BOM头的影响所导致的,可以用条件语句过滤掉
f.txt文件编码是ANSL
转换为char类型的出现的不符合预期的转换效果,本来想要转换成“你好”的,但是转换了ä½å¥½这么些看不懂的乱码
package com.baidu.字节输入输出流;
import java.io.FileInputStream;
import java.io.IOException;
public class InputStream04 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("F:\\develop\\e.txt");
int len = 0;
while ((len=fis.read())!=-1){
System.out.println((char)len);
}
fis.close();
}
}
输出结果:
ï
»
¿
ä
½
å
¥
½
字节流的缺点解决不了中文的问题,因为字节流是一个一个读取的,而字符流就可以很好的解决中文乱码的问题