将Stream转换为String Java / Groovy

时间:2011-04-29 20:42:42

标签: java groovy

我从网上偷走了这个片段。但它看起来仅限于4096字节并且是非常难看的IMO。谁知道更好的方法?我实际上正在使用Groovy btw ...

String streamToString(InputStream input) {
        StringBuffer out = new StringBuffer();
        byte[] b = new byte[4096];
        for (int n; (n = input.read(b)) != -1;) {
            out.append(new String(b, 0, n));
        }
        return out.toString();
    }

编辑:

我在Groovy中找到了更好的解决方案:

InputStream exportTemplateStream = getClass().getClassLoader().getResourceAsStream("export.template")
assert exportTemplateStream: "[export.template stream] resource not found"
String exportTemplate = exportTemplateStream.text

8 个答案:

答案 0 :(得分:45)

一些好的和快速的答案。但是我认为最好的是Groovy为InputStream添加了一个“getText”方法。所以我所要做的就是stream.text。并且很好地致电4096评论。

答案 1 :(得分:10)

对于Groovy

filePath = ... //< a FilePath object
stream = filePath.read() //< InputStream object

content = stream.getText("UTF-16") //< Specify the encoding, and get the String object

The InputStream class reference

getText()没有编码,它将使用当前系统编码,ex(&#34; UTF-8&#34;)。

答案 2 :(得分:8)

从Apache Commons尝试IOUtils

String s = IOUtils.toString(inputStream, "UTF-8");

答案 3 :(得分:4)

您可以使用Scanner类轻松地完成此操作:

String streamToSring(InputStream input) {
    Scanner s = new Scanner(input);
    StringBuilder builder = new StringBuilder();
    while (s.hasNextLine()) {
        builder.append(s.nextLine() +"\n");
    }
    return builder.toString();
}

答案 4 :(得分:4)

它以4096字节(4KB)的块读取输入,但实际字符串的大小不受限制,因为它不断读取并将其附加到SringBuffer。

答案 5 :(得分:2)

该代码片段有一个错误:如果输入使用多字节字符编码,则单个字符很可能会跨越两个读取(并且不可转换)。它还有一个半缺陷,它依赖于平台的默认编码。

相反,请使用Jakarta Commons IO。特别是,IOUtils.toString()的版本采用InputStream并对其应用编码。

答案 6 :(得分:1)

对于遇到类似问题的未来审阅者,请注意Apache的IOUtil和Groovy的InputStream.getText()方法都要求流完成,或者在返回之前关闭。如果您正在使用持久流,您将需要处理Phil最初发布的“丑陋”示例,或使用非阻塞IO。

答案 7 :(得分:0)

您可以尝试与此相似的内容

new FileInputStream( new File("c:/tmp/file.txt") ).eachLine { println it }