解决将InputStream流转换成字符串乱码的问题
Java中实现将InputStream字节流转换成字符串,经常会碰到结果的String出现中文汉字乱码的问题,引起乱码的问题,主要是编码格式,所以在转换的过程中,需要特别注意指定编码格式,比如utf-8、gbk等等。
1. 使用 IOUtils.toString (Apache commons-io)
使用Apache基金会创建并维护的Java函数库 commons-io 的 IOUtils 。
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,解决乱码问题的几种方法。