Sie haben in Ihrem Kommentar zu Calums Antwort angegeben, dass Sie sie verwenden würden
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Dieser Code ist problematisch, da die Überlast CharStreams.toString(Readable)lautet:
Schließt das nicht Readable.
Dies bedeutet, dass Ihr InputStreamReaderund im weiteren Sinne das InputStreamzurückgegebene von supplier.get()nach Abschluss dieses Codes nicht geschlossen wird.
Wenn Sie andererseits die Tatsache ausnutzen, dass Sie anscheinend bereits eine haben InputSupplier<InputStream>und die Überladung verwendet haben CharStreams.toString(InputSupplier<R extends Readable & Closeable>, toStringübernimmt die Methode sowohl das Erstellen als auch das Schließen der Readerfür Sie.
Dies ist genau das, was Jon Skeet vorgeschlagen hat, außer dass es tatsächlich keine Überladung gibt CharStreams.newReaderSupplier, die InputStreamals Eingabe verwendet wird ... Sie müssen ihm Folgendes geben 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);
Ziel InputSupplierist es, Ihnen das Leben zu erleichtern, indem Sie Guava erlauben, mit den Teilen umzugehen, die einen hässlichen try-finallyBlock erfordern , um sicherzustellen, dass die Ressourcen ordnungsgemäß geschlossen werden.
Bearbeiten: Persönlich finde ich Folgendes (so würde ich es tatsächlich schreiben, habe nur die Schritte im obigen Code aufgeschlüsselt)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
wird weit weniger ausführlich als das:
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);
}
Welches ist mehr oder weniger das, was Sie schreiben müssten, um dies selbst richtig zu handhaben.
Bearbeiten: Februar 2014
InputSupplierund OutputSupplierund die Methoden, die sie verwenden, sind in Guava 16.0 veraltet. Deren Ersatz sind ByteSource, CharSource, ByteSinkund CharSink. Mit a ByteSourcekönnen Sie den Inhalt nun wie Stringfolgt abrufen:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII), anstatt Sie sagen zu lassen: "Äh, welcher Zeichensatz denke ich?" was allen zu gerne scheint. Zumal Java keine sinnvolle Standardeinstellung wie UTF-8 verwendet.