W swoim komentarzu do odpowiedzi Caluma stwierdziłeś, że zamierzasz użyć
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Ten kod jest problematyczny, ponieważ przeciążenie CharStreams.toString(Readable)stwierdza:
Nie zamyka Readable.
Oznacza to, że Twoje InputStreamReaderi przez rozszerzenie InputStreamzwrócone przez supplier.get()nie zostaną zamknięte po zakończeniu tego kodu.
Jeśli, z drugiej strony, wykorzystasz fakt, że wydaje się, że masz już InputSupplier<InputStream>przeciążenie i wykorzystałeś jeCharStreams.toString(InputSupplier<R extends Readable & Closeable> ), toStringmetoda zajmie się zarówno utworzeniem, jak i zamknięciemReader .
To jest dokładnie to, co zasugerował Jon Skeet, z wyjątkiem tego, że w rzeczywistości nie ma żadnego przeciążenia, CharStreams.newReaderSupplierktóre pobiera InputStreamjako dane wejściowe ... musisz podać mu 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);
Punkt InputSupplier to, aby ułatwić sobie życie, umożliwiając guawie obsługę części, które wymagają brzydkiego try-finallybloku, aby zapewnić prawidłowe zamknięcie zasobów.
Edycja: Osobiście uważam, że następujące (tak naprawdę to napisałbym, po prostu rozbijały kroki w powyższym kodzie)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
być znacznie mniej szczegółowym niż to:
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);
}
To mniej więcej tyle, ile trzeba by napisać, żeby samemu sobie z tym poradzić.
Edycja: luty 2014
InputSuppliera OutputSuppliermetody, które ich używają, zostały uznane za przestarzałe w Guava 16.0. Ich zamienniki są ByteSource, CharSource, ByteSinki CharSink. Biorąc pod uwagę ByteSource, możesz teraz pobrać jego zawartość w następujący sposób String:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII), Zamiast pozwalać ci mówić "eh, jakikolwiek zgaduję?" co wielu ludziom wydaje się szczęśliwe. Zwłaszcza, że Java nie używa wartości domyślnych, które mają sens, jak UTF-8.