我从网上偷走了这个片段。但它看起来仅限于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
答案 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 }