代码之家  ›  专栏  ›  技术社区  ›  jthg

从inputstream读取文本[重复]

  •  24
  • jthg  · 技术社区  · 15 年前

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

    这应该很容易,但我主要是一个C人和谷歌是失败的我在这方面。谢谢。

    5 回复  |  直到 9 年前
        1
  •  18
  •   zznate    15 年前

    根据您对哪些许可证感到满意,它是 one liner 雅加达公共图书馆。

        2
  •  10
  •   erickson    15 年前

    指定字符编码。 浪费代码,引入错误,并使用 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
  •   Peter Lawrey    15 年前

    使用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
  •  1
  •   Dónal    15 年前

    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()
        }
    
    }
    
        5
  •  1
  •   thug-gamer    9 年前

    我在Java 8中找到了一个很好的方法:

    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”)交换,但我对这个构造函数没有经验。