В своем комментарии к ответу Калума вы заявили, что собираетесь использовать
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
для вас.
Это именно то, что предложил Джон Скит, за исключением того, что на самом деле нет никакой перегрузки, 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
том, чтобы упростить вашу жизнь, позволив Guava обрабатывать части, требующие уродливого 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 г.
InputSupplier
и OutputSupplier
методы, которые их используют, устарели в Guava 16.0. Их замены являются ByteSource
, CharSource
, ByteSink
и CharSink
. Учитывая a ByteSource
, теперь вы можете получить его содержимое String
следующим образом:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
), вместо того, чтобы позволять вам говорить «а, какую кодировку я думаю?» что многим кажется счастливым делать. Тем более, что Java не использует значение по умолчанию, которое имеет смысл, например UTF-8.