24

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

InputStream获取并将其转换为 的最简单方法是String什么?

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

6 回答 6

24

如果你想简单可靠地做到这一点,我建议使用Apache Jakarta Commons IO 库IOUtils.toString(java.io.InputStream, java.lang.String)方法。

于 2009-11-19T14:53:11.060 回答
21

这是我的版本

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
}
于 2009-11-19T14:55:55.003 回答
10
String text = new Scanner(inputStream).useDelimiter("\\A").next();

唯一棘手的是要记住\A匹配输入开头的正则表达式。这有效地告诉Scanner标记整个流,从开始到(不合逻辑的)下一个开始......
- 来自Oracle 博客

于 2010-07-17T13:14:11.093 回答
2

由于 Java 9 InputStream.readAllBytes()更短:

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

注意:本例中没有关闭InputStream 。

于 2020-04-29T16:40:09.203 回答
1

您可以使用 a在循环BufferedReader中将流读入 a 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上找到的解决方案。我在这里发布它以征求意见和批评。

于 2009-11-19T14:47:33.427 回答
1

一个很好的方法是使用Apache commons IOUtils

IOUtils.toString(inputStream, string);
于 2019-12-21T15:03:37.230 回答