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 InputStream
restituito 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 toString
metodo gestirà sia la creazione che la chiusura del Reader
per te.
Questo è esattamente ciò che ha suggerito Jon Skeet, tranne per il fatto che in realtà non c'è alcun sovraccarico CharStreams.newReaderSupplier
che prende un InputStream
input ... 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-finally
blocco 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
InputSupplier
e OutputSupplier
i metodi che li utilizzano sono stati deprecati in Guava 16.0. I loro sostituti sono ByteSource
, CharSource
, ByteSink
e CharSink
. Dato un ByteSource
, ora puoi ottenere il suo contenuto in String
questo 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.