【问题标题】:Read text from InputStream [duplicate]从 InputStream 中读取文本 [重复]
【发布时间】:2010-12-25 21:13:18
【问题描述】:

如果我从 java.io.InputStream 开始,将整个流读入字符串(假设为 utf-8)最简单的方法是什么?

这应该很容易,但我主要是 C# 人,谷歌在这方面让我失望。谢谢。

【问题讨论】:

标签: java


【解决方案1】:

根据您熟悉的许可证,它是带有 Jakarta-Commons IO 库的 one liner

【讨论】:

  • +1 - 除非您知道自己在做什么,否则重用广泛使用的库可以节省时间和精力。
  • 我最终使用了 org.apache.commons.io.IOUtils.toString(InputStream input, String encoding)
  • 当人们从 Jakarta Commons 提出建议时,我总是投赞成票。尽管很无聊,但您仍然需要在一天结束时交付一些业务逻辑,每天重新发明轮子是没有意义的。
  • +1 这个太有用了,我用java很久了,就是不明白为什么要玩他们乏味的I/O游戏。
【解决方案2】:

指定字符编码。 不要使用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();
}

【讨论】:

  • +1 - 但一个常见的习惯用法是将循环编写如下:int n; while((n = r.read(buf)) &gt;= 0) { s.append(buf, 0, n); }
  • 不幸的是,这是一个常见的成语。但我更喜欢避免有副作用的测试。
【解决方案3】:

使用 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);
}

【讨论】:

    【解决方案4】:

    在 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()
        }
    
    }
    

    【讨论】:

    • 用新的 InputStreamReader(stream, "UTF-8") 交换新的 InputStreamReader(stream)
    • 您的代码会丢弃换行符。
    • 您的代码更改了换行符。如果你有 DOS 新行,你的字符串会更短。
    【解决方案5】:

    我在 Java 8 中找到了一种带有流的好方法:

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

    如上所述,您可以将 new InputStreamReader(is) 与 new InputStreamReader(is, "UTF-8") 交换,但我没有使用此构造函数的经验。

    【讨论】:

    • 您的建议在结果中丢失了 \n 行终止符。
    • @Gabriel 好点。怎么样:br.lines().reduce("\n", String::concat)
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 2019-08-19
    • 2015-07-25
    • 2012-03-03
    • 2015-08-13
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多