Ви сказали у своєму коментарі на відповідь Калума, що збираєтесь використовувати
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();
Charsets.US_ASCII
), А не дозволяли вам сказати "так, що б я не нагадала?" що багатьом людям здається щасливим зробити. Тим більше, що Java не використовує сенсор, який має сенс, як UTF-8.