从InputStream读取文本

39

如果我有一个java.io.InputStream,想要将整个流读取到一个字符串中(假设使用utf-8编码),最简单的方法是什么?

这应该很容易,但我主要是C#开发人员,而且谷歌上也没有找到相关方法。谢谢。


2
https://dev59.com/UHVC5IYBdhLWcg3wZwJT - akuhn
哦,我没有搜索“输入流”(中间有一个空格)。 - jthg
5个回答

20

根据您对许可证的偏好,使用Jakarta-Commons IO库可以通过一条语句实现。


2
+1 - 除非你知道自己在做什么,否则重用广泛使用的库可以节省时间和精力。 - Stephen C
2
最终我使用了org.apache.commons.io.IOUtils.toString(InputStream input, String encoding)。 - jthg
2
当有人建议使用Jakarta Commons时,我总是会点赞。尽管这很无聊,但你仍然需要在今天结束之前交付一些业务逻辑,每天重新发明轮子是没有意义的。 - Ravi Wallau
+1 这太有用了,我已经使用 Java 很长时间了,但我就是不明白为什么我需要玩他们那繁琐的 I/O 游戏。 - Zombies

10

一定要指定字符编码。不要用BufferedReader浪费代码,引入错误和减缓执行速度。

以下是一个示例。您可以使用缓冲区大小、编码等进行参数化。

static String readString(InputStream is) throws IOException {
  char[] buf = new char[2048];
  Reader r = new InputStreamReader(is, "UTF-8");
  StringBuilder s = new StringBuilder();
  while (true) {
    int n = r.read(buf);
    if (n < 0)
      break;
    s.append(buf, 0, n);
  }
  return s.toString();
}

3
+1 - 但常用的习惯用语是将循环写成以下形式:int n; while((n = r.read(buf)) >= 0) { s.append(buf, 0, n); } - Stephen C
4
很遗憾,这是一个常见的习语。但我更喜欢避免带有副作用的测试。 - erickson

1
我在Java 8中使用流(streams)找到了一种不错的方法:

public static String readString(InputStream is) {
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String content = br.lines().reduce("", String::concat);
    return content;
}

如上所述,您可以将新的InputStreamReader(is)替换为新的InputStreamReader(is, "UTF-8"),但我对这个构造函数没有经验。

您的建议在结果中丢失了 \n 行终止符。 - Gabriel
@Gabriel 很好的观点。那么这个怎么样:br.lines().reduce("\n", String::concat) - thug-gamer

1

在Java中,从流中读取/写入数据是异常痛苦的。

public static String getStreamContents(InputStream stream) throws IOException {

    StringBuilder content = new StringBuilder()

    Reader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"))
    String lineSeparator = System.getProperty("line.separator");

    try {
        String line
        while ((line = reader.readLine()) != null) {
            content.append(line + lineSeparator)
        }
        return content.toString()

    } finally {
        reader.close()
    }

}

1
使用 new InputStreamReader(stream, "UTF-8") 替换原代码中的 new InputStreamReader(stream)。 - Buhb
1
你的代码丢弃了换行。 - Stephen C
你的代码改变了换行符。如果你有DOS换行符,你的字符串会更短。 - Peter Lawrey

1

使用Commons-IO可能是最佳选择。 如果您感兴趣,另一种方法是复制所有字节,然后将其转换为字符串。

public static String readText(InputStream is, String charset) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] bytes = new byte[4096];
    for(int len;(len = is.read(bytes))>0;)
        baos.write(bytes, 0, len);
    return new String(baos.toByteArray(), charset);
}

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