2011-04-29 8 views
16

このスニペットをWebから盗んだ。しかし、それは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(); 
    } 

EDIT:

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

それでは、あなたは質問した後にドキュメントをチェックしましたか?少なくとも、その使用例を貼り付けることができます。 – Anon

+1

私はもちろん尋ねた後、私は最初に.textメソッドを見ていませんでした。コードスニペットは次のとおりです。InputStream exportTemplateStream = getClass()。getClassLoader()。getResourceAsStream( "export.template") assert exportTemplateStream: "[export.template stream]リソースが見つかりません" 文字列exportTemplate = exportTemplateStream.text –

+0

十分に適切です。しかし、他の人に言ったように、明示的な文字セットを取るバリアントを使用してください。デフォルトの文字セットはほとんどあなたが望むものではありません。 – Anon

4

あなたはかなり容易Scannerクラスを使用してそれを行うことができます:私はGroovyでより良い解決策を見つけた

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

+0

@Anon、このコードには多くのバグがあるかもしれません。コードは例としてのみ提示されています。プロダクションでは使用しないでください。 – jjnguy

+1

@jinguy - 「インターネットを改善する」バグのコードを表示しますか?または単に担当者に追加しますか? – Anon

4

入力は4096バイト(4KB)のチャンクで読み込みますが、実際の文字列のサイズは制限されませんそれは読み込みを続けて、SringBufferに追加します。

7

のApache CommonsのからIOUtilsをお試しください:スニペット

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

にはバグがあります。入力がマルチバイト文字エンコーディングを使用している場合は、単一の文字は、2つの読み込み(とはならないまたがることを良いチャンスがあります変換可能)。また、プラットフォームのデフォルトのエンコーディングに依存する半バグもあります。

代わりに、Jakarta Commons IOを使用してください。特にIOUtils.toString()のバージョンはInputStreamで、エンコードが適用されます。

1

同様の問題を抱える将来の査読者のために、ApacheのIOUtilsとGroovyのInputStream.getText()メソッドは、ストリームを完了する必要があります。永続的なストリームを使って作業しているなら、Philが最初に投稿した "醜い"例に対処することや、ノンブロッキングIOで作業することに躊躇します。あなたはエンコードせずに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()については、この

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

、それは現在のシステムエンコーディング、EX( "UTF-8を使用します。 ")。

7

に似た何かを試すことができます

関連する問題