Frage
Gibt es ein prägnantes / standard Idiom (zum Beispiel eines JDK-Verfahren) für „Rohrleitung“ ein Eingang zu einem Ausgang in Java als die folgenden?
public void pipe(Reader in, Writer out) { CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); while( in.read(buf) >= 0 ) { out.append(buf.flip()); buf.clear(); } }
[EDIT] Bitte beachten Sie die Reader
und Writer
sind gegeben . Die richtige Antwort wird zeigen, wie in
und out
zu nehmen und ein Rohr bilden (vorzugsweise mit nicht mehr als 1 oder 2 Methodenaufrufen). Ich will Antworten annehmen, wenn in
und out
sind ein InputStream
und ein OutputStream
(vorzugsweise mit einem Umsatz von / bis Reader
/ Writer
). Ich werde keine Antworten annehmen, wenn entweder in
oder out
ist ein Unterklasse von Reader
/ InputStream
oder Writer
/ OutputStrem
.
Lösung
IOUtils aus dem Apache Commons Projekt hat eine Reihe von utilily Methoden das tun genau das, was Sie brauchen.
IOUtils.copy(in, out)
wird eine gepufferte Kopie aller Eingang zum Ausgang durchzuführen. Wenn es mehr als ein Punkt in Ihrer Code-Basis ist, die Stream
oder Reader
/ Writer
Handhabung erfordert, IOUtils mit einer guten Idee sein könnte.
Andere Tipps
Hier finden Sie aktuelle java.io.PipedInputStream und PipedOutputStream oder PipedReader / PipedWriter aus dem gleichen Paket
Aus der Dokumentation der PipedInputStream:
A verrohrt Eingabestrom sollte auf einen Ausgabestrom verrohrt angeschlossen werden; der verrohrt Eingangsstrom liefert dann unabhängig von Datenbytes an den verrohrt Ausgabestrom geschrieben werden. Typischerweise werden Daten von einem PipedInputStream Objekt von einem Thread zu lesen und Daten an die entsprechenden PipedOutputStream durch einen anderen Thread geschrieben wird. beide Objekte aus einem einzigen Thread zu verwenden versuchen, wird nicht empfohlen, da sie die Thread-Deadlock kann. Der verrohrt Eingangsstrom enthält einen Puffer, die Leseoperationen von Schreiboperationen entkoppeln, in Grenzen. Ein Rohr wird gesagt, um gebrochen werden, wenn ein Thread, der Daten-Bytes an die angeschlossenen Ausgabestrom geleitet wurde die Bereitstellung nicht mehr lebt.
Die einzige Optimierung verfügbar ist durch FileChannels in dem NIO-API: Liest , Schreibt . Die JVM kann diesen Aufruf optimieren, um die Daten aus einer Datei zu einem Ziel-Kanal zu bewegen, ohne zuerst die Daten zu bewegen, mit Raum zum Kernel. Siehe diesem Artikel .