Hai dichiarato nel tuo commento alla risposta di Calum che avresti usato
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Questo codice è problematico perché il sovraccarico CharStreams.toString(Readable)afferma:
Non chiude il file Readable.
Ciò significa che il tuo InputStreamReader, e per estensione il InputStreamrestituito da supplier.get(), non verrà chiuso al termine di questo codice.
Se invece approfitti del fatto che sembra che tu abbia già un InputSupplier<InputStream>e hai utilizzato l'overload CharStreams.toString(InputSupplier<R extends Readable & Closeable>), il toStringmetodo gestirà sia la creazione che la chiusura del Readerper te.
Questo è esattamente ciò che ha suggerito Jon Skeet, tranne per il fatto che in realtà non c'è alcun sovraccarico CharStreams.newReaderSupplierche prende un InputStreaminput ... devi dargli un 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);
Il punto InputSupplierè semplificarti la vita consentendo a Guava di gestire le parti che richiedono un brutto try-finallyblocco per garantire che le risorse siano chiuse correttamente.
Modifica: personalmente, trovo quanto segue (che è come lo scriverei effettivamente, stavo solo analizzando i passaggi nel codice sopra)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
essere molto meno prolisso di questo:
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);
}
Che è più o meno quello che dovresti scrivere per gestirlo correttamente da solo.
Modifica: febbraio 2014
InputSuppliere OutputSupplieri metodi che li utilizzano sono stati deprecati in Guava 16.0. I loro sostituti sono ByteSource, CharSource, ByteSinke CharSink. Dato un ByteSource, ora puoi ottenere il suo contenuto in Stringquesto modo:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII) piuttosto che lasciarti dire "eh, qualunque set di caratteri immagino?" cosa che molte persone sembrano felici di fare. Soprattutto perché Java non utilizza un valore predefinito che abbia senso, come UTF-8.