在Java中,我该如何将InputStream转换为String?

24

假设我有一个包含文本数据的InputStream,我想将其转换为String(例如,这样我就可以将流的内容写入日志文件)。

最简单的方法是什么,可以将 InputStream 转换为 String

public String convertStreamToString(InputStream is) { 
    // ???
}

5
可能是在Java中如何将输入流读取为字符串?的重复问题。 - Rob Hruska
同意。我已经投票将此问题关闭为重复,并编辑了另一个问题,以包含一些来自这里的标题关键词和问题文本。 - Daniel Fortunov
6个回答

24

1
这是简短而简洁的方式。 - Kushal Paudyal
3
唯一的缺点是你需要在此库中引入外部依赖项,这可能并不总是理想的。 - Daniel Fortunov
1
你需要指定编码方式,否则它将使用平台默认值,这是不可靠的。 - Christoffer Hammarström

22

这是我的版本,

public static String readString(InputStream inputStream) throws IOException {

    ByteArrayOutputStream into = new ByteArrayOutputStream();
    byte[] buf = new byte[4096];
    for (int n; 0 < (n = inputStream.read(buf));) {
        into.write(buf, 0, n);
    }
    into.close();
    return new String(into.toByteArray(), "UTF-8"); // Or whatever encoding
}

11
String text = new Scanner(inputStream).useDelimiter("\\A").next();

唯一需要注意的是要记住正则表达式\A,它匹配输入的开头。这有效地告诉Scanner将整个流标记化,从开头到(不合理的)下一个开头...
- 来自Oracle Blog


3

自Java 9起,InputStream.readAllBytes()更加简洁:

String toString(InputStream inputStream) throws IOException {
   return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); // Or whatever encoding
}

注意:这个例子中没有关闭InputStream。


1

您可以使用BufferedReader在循环中将流读入StringBuilder,然后从StringBuilder获取完整内容:

public String convertStreamToString(InputStream is) { 
  BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
  StringBuilder sb = new StringBuilder(); 

  String line = null; 

  try { 
    while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
    } 
  } catch (IOException e) { 
    e.printStackTrace(); 
  } finally { 
    try { 
      is.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  }

  return sb.toString(); 
} 

完全披露: 这是我在KodeJava.org上找到的解决方案。我在此发布它以供评论和批评。


2
请注意,您正在使用的 BufferedReader 构造函数假定从 InputStream 中获取的字节采用平台默认文本编码,这可能是错误的。您必须知道编码并在 Reader 构造函数中指定它。 - Jonathan Feinberg
4
使用这个构造函数,你告诉InputStreamReader使用默认的平台编码,这是应该避免的。你应该指定数据所使用的字符集,以便正确解码,可以使用其他三个构造函数之一来实现。 - Sylar
2
使用BufferedReader在换行符上拆分输入,然后手动将换行符添加到StringBuilder中几乎是不必要的努力,而实际上使用StringBuilder来防止String对象创建,但随后调用append(line + "\n")而不是append(line).append("\n")几乎是一种令人困惑的做法。关闭InputStream也不是特别聪明的做法。 - jarnbjo

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接