あなたはあなたが使用するつもりであった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のような意味のあるデフォルトを使用しないためです。