java读取本地文件时,若使用InputStream来读取,经常会遇到读取到的内容中有一小部分中文乱码的情况
原因
gbk编码一个汉字占用2个字节,utf-8编码占用三个字节,如果文件是gbk编码还好,定义一个长度为偶数的字节数组接收stream的内容即可,但是utf-8编码就蛋疼了,根本没办法保证每次读取最后一位是不是会把那个汉字给切割开来,如果一个汉字的3个字节被切割成了两节,就会出现乱码。
- 错误的代码示例
File file = new File("/root/a.txt");
FileInputStream in = new FileInputStream(file);
byte[] b = new byte[2048];
int c = 0;
StringBuilder text = new StringBuilder();
while((c = in.read(b)) != -1){
text.append(new String(b,0,c));
}
System.out.println("读取到的文本内容:" + text.toString() );
解决办法
读取流的方式得改,不能用上面那种方式,修改后的代码如下
File file = new File("/root/a.txt");
FileInputStream in = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
StringBuilder text = new StringBuilder();
while (br.ready()) {
text.append(br.readLine()).append("\n");
}
System.out.println("读取到的文本内容:" + text.toString() );
使用InputStreamReader
按行读取,new的时候注意指定编码,若为utf-8则填入 StandardCharsets.UTF_8
评论区