Ви сказали у своєму коментарі на відповідь Калума, що збираєтесь використовувати
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.