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 InputStreamReader
i przez rozszerzenie InputStream
zwró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>
), toString
metoda 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.newReaderSupplier
które pobiera InputStream
jako 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-finally
bloku, 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
InputSupplier
a OutputSupplier
metody, które ich używają, zostały uznane za przestarzałe w Guava 16.0. Ich zamienniki są ByteSource
, CharSource
, ByteSink
i 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.