あなたはあなたが使用するつもりであったCalumの答えに関するコメントで述べました
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
このコードは、オーバーロードがCharStreams.toString(Readable)次のように述べるので問題があります。
を閉じませんReadable。
これは、このコードが完了した後、あなたのInputStreamReader、さらにはによってInputStream返されたsupplier.get()は閉じられないことを意味します。
一方、すでにを持っているように見えInputSupplier<InputStream>、オーバーロードを使用したという事実を利用したCharStreams.toString(InputSupplier<R extends Readable & Closeable>場合、toStringメソッドは、の作成とクローズの両方を処理します。Readerします。
これはJon Skeetの提案とまったく同じですが、実際には入力として受け取るオーバーロードはありませんCharStreams.newReaderSupplierが、次のInputStreamように指定する必要がありますInputSupplier。
InputSupplier<? extends InputStream> supplier = ...
InputSupplier<InputStreamReader> readerSupplier =
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8);
// InputStream and Reader are both created and closed in this single call
String text = CharStreams.toString(readerSupplier);
ポイントはInputSupplier、グアバが醜いものを必要とする部品を処理できるようにすることであなたの人生をより簡単にすることですtry-finally、リソースが適切に閉じられるようにするためにブロックをにすることです。
編集:個人的に、私は次のことを見つけます(これは実際に私がそれを書く方法であり、上のコードのステップを分解しただけです)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
これよりもはるかに冗長ではありません:
String text;
InputStreamReader reader = new InputStreamReader(supplier.get(),
Charsets.UTF_8);
boolean threw = true;
try {
text = CharStreams.toString(reader);
threw = false;
}
finally {
Closeables.close(reader, threw);
}
これは多かれ少なかれ、これを自分で適切に処理するために書かなければならないことです。
編集:2014年2月
InputSupplierそしてOutputSupplierそれらを使用するメソッドはGuava 16.0で廃止されました。彼らの置換がありByteSource、CharSource、ByteSinkとCharSink。を指定すると、ByteSourceその内容を次のStringように取得できます。
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII「ええと、どんな文字セットだと思いますか?」多くの人にとって、これは幸せに思えます。特に、JavaはUTF-8のような意味のあるデフォルトを使用しないためです。