2011-04-29 201 views
16

我将这段代码从网络上偷走。但它看起来被限制为4096字节,并且是相当丑陋的IMO。任何人都知道更好的方法?实际上,我使用Groovy顺便说一句...将流转换为字符串Java/Groovy

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 

回答

36

一些好的和快速的答案。不过我认为最好的一个是Groovy为InputStream添加了一个“getText”方法。所以我所要做的只是stream.text。并请拨打4096评论。

+2

所以你检查了文档_after_问?至少你可以粘贴一个使用例子。 – Anon 2011-04-29 21:00:09

+1

我继续照顾我当然问起,我一开始没有看到.text方法。这里是代码片段:InputStream exportTemplateStream = getClass()。getClassLoader()。getResourceAsStream(“export.template”) assert exportTemplateStream:“[export.template stream] resource not found” String exportTemplate = exportTemplateStream.text – 2011-04-30 21:53:21

+0

不够公平。但正如我对其他人所说的:使用带有明确字符集的变体 - 默认字符集很少是您想要的。 – Anon 2011-04-30 22:43:55

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(); 
} 
+0

你需要传递一个字符集,否则你将有一个难以诊断的错误。 – Anon 2011-04-29 20:52:46

+0

@Anon,这段代码可能有很多bug。代码仅作为示例呈现;不用于生产。 – jjnguy 2011-04-30 00:37:13

+1

@jinguy - 提出错误代码“改善互联网”?或者干脆添加到代表? – Anon 2011-04-30 11:22:27

4

它读取4096字节(4KB)块的输入,但实际字符串的大小不是限制因为它会继续阅读更多内容并将其附加到SringBuffer。

7

尝试IOUtils从Apache的百科全书:

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

片断代码有一个错误:如果输入采用的是多字节字符编码,有一个很好的机会,单个字符会跨越两个读(和不可转换)。而且它还具有依赖平台默认编码的半错误。可以使用Jakarta Commons IO。具体而言,IOUtils.toString()的版本采用InputStream并对其应用编码。

1

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

0

您可以尝试类似这样

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

东西对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(“UTF-8 “)。