【问题标题】:How do I convert an InputStream to a String in Java?如何在 Java 中将 InputStream 转换为字符串?
【发布时间】:2010-12-18 08:08:52
【问题描述】:

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

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

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

【问题讨论】:

标签: java stream inputstream


【解决方案1】:

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

【讨论】:

  • 这是简短而甜蜜的方式。
  • 唯一的缺点是你需要在这个库中获取外部依赖,这可能并不总是需要的。
  • 您也需要指定编码,否则它将使用平台默认值,这是不可靠的。
【解决方案2】:

这是我的版本,

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
}

【讨论】:

    【解决方案3】:
    String text = new Scanner(inputStream).useDelimiter("\\A").next();
    

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

    【讨论】:

      【解决方案4】:

      自从 Java 9 InputStream.readAllBytes() 更短:

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

      注意: InputStream 在此示例中关闭。

      【讨论】:

        【解决方案5】:

        可以在循环中使用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 上找到的解决方案。我在这里发布它以供 cmets 和批评。

        【讨论】:

        • 请记住,您使用的 BufferedReader 构造函数假定来自 InputStream 的字节采用平台默认文本编码,这可能是错误的。您必须知道编码并在 Reader 构造函数中指定它。
        • 通过使用这个构造函数,你告诉 InputStreamReader 使用默认的平台编码,应该避免。您应该指定数据编码的字符集,以便使用其他三个构造函数之一正确解码。
        • 使用 BufferedReader 在换行符处拆分输入也是不必要的,只是手动将换行符添加到 StringBuilder 和几乎一个 WTF 以实际使用 StringBuilder 来防止创建 String 对象,但是然后调用 append(line + "\n") 而不是 append(line).append("\n")。关闭 InputStream 也不是特别聪明。
        【解决方案6】:

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

        IOUtils.toString(inputStream, string);
        

        【讨论】:

          猜你喜欢
          • 2010-10-21
          • 2010-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多