Calum'un cevabına yorumunuzda kullanacağınızı belirtmişsiniz.
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Bu kod sorunludur çünkü aşırı yük CharStreams.toString(Readable)
durumu:
Kapatmaz Readable
.
Bu, sizin InputStreamReader
ve uzantıya göre InputStream
iade edilensupplier.get()
bu kod tamamlandıktan sonra kapatılmayacağı .
Öte yandan, halihazırda bir InputSupplier<InputStream>
aşırı yüklemeye sahip olduğunuz ve aşırı yüklemeyi kullandığınız gerçeğinden yararlanırsanız CharStreams.toString(InputSupplier<R extends Readable & Closeable>
), toString
yöntem hem oluşturmayı hem de kapatmayı ele alacaktır.Reader
sizin için .
Bu tam olarak Jon Skeet'in önerdiği şeydir, ancak aslında girdi olarak CharStreams.newReaderSupplier
alan herhangi bir aşırı yükleme yoktur InputStream
... ona bir vermelisiniz 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);
Buradaki InputSupplier
amaç, Guava'nın try-finally
kaynakların düzgün bir şekilde kapatılmasını sağlamak için çirkin bir blok gerektiren parçaları işlemesine izin vererek hayatınızı kolaylaştırmaktır .
Düzenleme: Şahsen, aşağıdakileri buluyorum (aslında bunu böyle yazıyordum, sadece yukarıdaki koddaki adımları parçalıyordu)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
bundan çok daha az ayrıntılı olmak :
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);
}
Bunu kendiniz halledebilmek için aşağı yukarı yazmanız gereken şey budur.
Düzenleme: Şubat 2014
InputSupplier
ve OutputSupplier
bunları kullanan yöntemler Guava 16.0'da kullanımdan kaldırılmıştır. Onların yerine vardır ByteSource
, CharSource
, ByteSink
ve CharSink
. A verildiğinde ByteSource
, artık içeriğini şu şekilde alabilirsiniz String
:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
"eh, tahmin ettiğim karakter seti ne olursa olsun" demenize izin vermek yerine, hangi karakter grubuyla uğraştığınızı (örneğin ) bilmenizi istemeniz yine de iyidir. birçok insan bunu yapmaktan mutlu görünüyor. Özellikle Java, UTF-8 gibi mantıklı bir varsayılan kullanmadığından.