Apache Commons IO hat eine nette Komfortmethode IOUtils.toString () zum Lesen eines StringsInputStream
.
Da ich versuche, mich von Apache Commons nach Guave zu entfernen: Gibt es in Guave ein Äquivalent? Ich habe mir alle Klassen im com.google.common.io
Paket angesehen und konnte nichts annähernd so Einfaches finden.
Bearbeiten: Ich verstehe und schätze die Probleme mit Zeichensätzen. Es kommt einfach so vor, dass ich weiß, dass alle meine Quellen in ASCII sind (ja, ASCII, nicht ANSI usw.). In diesem Fall ist die Codierung für mich kein Problem.
java
io
inputstream
guava
Sean Patrick Floyd
quelle
quelle
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.Antworten:
Sie haben in Ihrem Kommentar zu Calums Antwort angegeben, dass Sie sie verwenden würden
Dieser Code ist problematisch, da die Überlast
CharStreams.toString(Readable)
lautet:Dies bedeutet, dass Ihr
InputStreamReader
und im weiteren Sinne dasInputStream
zurückgegebene vonsupplier.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 habenCharStreams.toString(InputSupplier<R extends Readable & Closeable>
,toString
übernimmt die Methode sowohl das Erstellen als auch das Schließen derReader
für Sie.Dies ist genau das, was Jon Skeet vorgeschlagen hat, außer dass es tatsächlich keine Überladung gibt
CharStreams.newReaderSupplier
, dieInputStream
als Eingabe verwendet wird ... Sie müssen ihm Folgendes gebenInputSupplier
:Ziel
InputSupplier
ist es, Ihnen das Leben zu erleichtern, indem Sie Guava erlauben, mit den Teilen umzugehen, die einen hässlichentry-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)
wird weit weniger ausführlich als das:
Welches ist mehr oder weniger das, was Sie schreiben müssten, um dies selbst richtig zu handhaben.
Bearbeiten: Februar 2014
InputSupplier
undOutputSupplier
und die Methoden, die sie verwenden, sind in Guava 16.0 veraltet. Deren Ersatz sindByteSource
,CharSource
,ByteSink
undCharSink
. Mit aByteSource
können Sie den Inhalt nun wieString
folgt abrufen:quelle
InputStream
ist und Sie es als erhalten möchtenString
,CharStreams.toString(new InputStreamReader(inputStream, charset))
ist der richtige Weg.ByteSource
undCharSource
sind speziell für Fälle, in denen Sie etwas haben, das als Quelle vonInputStream
s oderReader
s dienen kann.Wenn Sie eine haben
Readable
, können Sie verwendenCharStreams.toString(Readable)
. Sie können also wahrscheinlich Folgendes tun:Erzwingt die Angabe eines Zeichensatzes, was Sie wahrscheinlich trotzdem tun sollten.
quelle
InputSupplier<InputStream>
würde ich dringend empfehlen,CharStreams.newReaderSupplier(supplier, Charsets.UTF_8)
anstatt zu verwendennew InputStreamReader
. Der Grund ist, dass, wenn das gegeben istInputStreamReader
,toString
das nicht geschlossen wirdReader
(und somit nicht der zugrunde liegende Stream!). Wenn Sie einInputSupplier
for für verwendenReader
,toString
übernimmt die Methode das Schließen desReader
for für Sie.UPDATE : Rückblickend mag ich meine alte Lösung nicht. Außerdem ist es jetzt 2013 und es gibt jetzt bessere Alternativen für Java7. Also hier ist was ich jetzt benutze:
oder wenn mit InputSupplier
quelle
Fast. Sie könnten so etwas verwenden:
Persönlich finde ich das nicht
IOUtils.toString(InputStream)
"nett" - weil es immer die Standardcodierung der Plattform verwendet, was fast nie das ist, was Sie wollen. Es gibt eine Überladung, die den Namen der Codierung annimmt, aber die Verwendung von Namen ist IMO keine gute Idee. Deshalb mag ichCharsets.*
.EDIT: Nicht, dass das oben genannte ein
InputSupplier<InputStream>
wie das brauchtstreamSupplier
. Wenn Sie den Stream bereits haben, können Sie dies jedoch leicht genug implementieren:quelle
Charsets.UTF_8.name()
- typo-resistenter.Eine andere Möglichkeit besteht darin, Bytes aus Stream zu lesen und daraus einen String zu erstellen:
Es ist keine "reine" Guave, aber etwas kürzer.
quelle
ByteStreams.toByteArray()
schließt der Stream laut Javadoc nicht.Basierend auf der akzeptierten Antwort ist hier eine Dienstprogrammmethode, die das Verhalten von
IOUtils.toString()
(und eine überladene Version mit einem Zeichensatz) verspottet . Diese Version sollte sicher sein, oder?quelle
Es gibt eine viel kürzere Autoclosing-Lösung für den Fall, dass der Eingabestream von einer Klassenpfadressource stammt:
Verwendet Guave Ressourcen , inspiriert von IOExplained .
quelle
EDIT (2015): Okio ist die beste Abstraktion und die besten Tools für E / A in Java / Android, die ich kenne. Ich benutze es die ganze Zeit.
FWIW hier ist was ich benutze.
Wenn ich bereits einen Stream in der Hand habe, dann:
Wenn ich einen Stream erstelle:
Als konkretes Beispiel kann ich ein Android-Textdatei-Asset wie folgt lesen:
quelle
Ein konkretes Beispiel ist, wie ich ein Android-Textdatei-Asset lesen kann:
quelle