2011-04-29 199 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 「)。