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 InputStreamReader
und im weiteren Sinne das InputStream
zurü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 Reader
für Sie.
Dies ist genau das, was Jon Skeet vorgeschlagen hat, außer dass es tatsächlich keine Überladung gibt CharStreams.newReaderSupplier
, die InputStream
als 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 InputSupplier
ist es, Ihnen das Leben zu erleichtern, indem Sie Guava erlauben, mit den Teilen umzugehen, die einen hässlichen try-finally
Block 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
InputSupplier
und OutputSupplier
und die Methoden, die sie verwenden, sind in Guava 16.0 veraltet. Deren Ersatz sind ByteSource
, CharSource
, ByteSink
und CharSink
. Mit a ByteSource
können Sie den Inhalt nun wie String
folgt 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.