解决将InputStream流转换成字符串乱码的问题

Java 2020-01-07 阅读 396 评论 0

Java中实现将InputStream字节流转换成字符串,经常会碰到结果的String出现中文汉字乱码的问题,引起乱码的问题,主要是编码格式,所以在转换的过程中,需要特别注意指定编码格式,比如utf-8、gbk等等。

1. 使用 IOUtils.toString (Apache commons-io)

使用Apache基金会创建并维护的Java函数库 commons-ioIOUtils

String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);

2. 使用StringWriter and IOUtils.copy (Apache commons-io)

copy(InputStream input, Writer output, Charset inputEncoding) 是使用指定的字符编码将字节从InputStream复制到Writer上的字符。

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, StandardCharsets.UTF_8);
return writer.toString();

3. 使用CharStreams (Guava)

使用 Google Guava 的 java 类库。

String result = CharStreams.toString(new InputStreamReader(inputStream, Charsets.UTF_8));

4. 使用InputStreamReader (JDK)

InputStreamReader 类是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。结合StringBuilder,将InputStream转换成String。

final char[] buffer = new char[1024];
final StringBuilder out = new StringBuilder();
Reader in = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
int length;
while ((length = in.read(buffer, 0, buffer.length)) != -1) {
    out.append(buffer, 0, length);
}
return out.toString();

5. 使用ByteArrayOutputStream 和 inputStream.read (JDK)

ByteArrayOutputStream 类是字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。

ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
    result.write(buffer, 0, length);
}
return result.toString("gbk");

以上几种方法,就是读取InputStream输入流并设置字符集,转化为String,解决乱码问题的几种方法。

最后更新 2020-01-20