您的位置:首页 > 其它

InputStream 读取中文乱码 扩展

2019-12-16 18:11 3187 查看
对于InputStream读取中文乱码,下面这段话给出了很好的解释,以及后续编码上的扩展。

BufferedInputStream和BufferedOutputStream是过滤流,需要使用已存在的节点来构造。
即必须先有InputStream或OutputStream,相对直接读写,这两个流提供带缓存的读写,提高了系统读写效率性能。
BufferedInputStream读取的是字节byte,因为一个汉字占两个字节,而当中英文混合的时候,有的字符占一个字节,有的字符占两个字节。
所以如果直接读字节,而数据比较长,没有一次读完的时候,很可能刚好读到一个汉字的前一个字节,这样,这个中文就成了乱码,后面的数据因为没有字节对齐,也都成了乱码。
所以我们需要用BufferedReader来读取,它读到的是字符,所以不会读到半个字符的情况,不会出现乱码。

 

package com.read;

import java.io.*;

/**
*千字文.txt 在 classpath 用来测试
*/
public class Main {

public static void main(String[] args) {

File file = new File("千字文.txt");

Object obj = loadFileContent(file);
if (obj!=null){
System.out.println(obj.toString());
}
}

/**
* 此方法 读到的是字符,所以不会读到半个字符的情况,不会出现乱码.
* @param file
* @return
*/
public static Object readFile(File file) {
StringBuilder buffer = new StringBuilder();
try {
if (!file.exists()) {
return null;
}

InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream));

while (bufferedReader.ready()) {
buffer.append((char) bufferedReader.read());
}

bufferedReader.close();
bufferedInputStream.close();
inputStream.close();

return buffer.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

/**
* byte字节流读取文件时 一个汉字占2个字节
* 可能只能读到半个 时长度没有一次读完时 字符无法对齐
* 出现乱码 可能会是以上原因
* @param file
* @return
*/
public static Object loadFileContent(File file) {
StringBuffer buffer = new StringBuffer();
try {

if (!file.exists()) {
return null;
}

InputStream inputStream = new FileInputStream(file);
byte[] bytes = new byte[1024];
int length;

while ((length = inputStream.read(bytes)) != -1) {
buffer.append(new String(bytes, 0, length));
}

inputStream.close();

return buffer.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: