В своем комментарии к ответу Калума вы указали, что собираетесь использовать
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
.Учитывая ByteSource
, теперь вы можете получить его содержимое в виде String
, например:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();