2016-08-03 26 views
3

Ich streame sehr große Datenmengen von InputStreams zu OutputStreams. Die Methode, die ich bin mit wie folgt aussieht:Suchen/Ersetzen zwischen InputStream und OutputStream

public static void forwardStream(InputStream in, OutputStream out) throws IOException 
{ 
    byte[] buffer = new byte[1024]; 
    int bytesRead; 

    while ((bytesRead = in.read(buffer)) != -1) { 
     out.write(buffer, 0, bytesRead); 
    } 
} 

Jetzt muss ich Suche durchführen/Ersetzen Operationen auf den Strom Inhalt vor seiner geschrieben. Das Laden des gesamten Streams in einen String und das Ausführen eines String.replace() ist aufgrund der großen Größe der gestreamten Daten keine Option.

Meine Idee wäre, den InputStream in eine Art von Hilfsklasse zu verkapseln, die InputStream erbt und die Ersetzungsoperationen ausführt, während der Inhalt gelesen wird. Gibt es da draußen bewährte Lösungen?

+0

Problem ist, ein InputStream ist eine Gruppe von Bytes, also bis Sie nicht alle Bytes lesen, Sie haben keine "übersetzte Zeichenfolge". Vielleicht solltest du versuchen, einen gechlossenen Inputstream zu lesen, aber ich denke, du wirst immer noch dasselbe Problem haben. etwas wie das . http://www.java2s.com/Code/Java/File-Input-Output/AnInputStreamthatiplementsHTTP11chunking.htm – duardito

+0

Klingt wie ein Job für Java8-Streams. Suchen Sie nach Tutorials wie [hier] (http://www.tutorialspoint.com/java8/java8_streams.htm) oder [hier] (http://winterbe.com/posts/2014/07/31/java8-stream- Tutorial-Beispiele /). – ArcticLord

+3

Auf der Stream-Ebene ist dies harte Sache (einmal gemacht, aber es ist bedauerlich schwierig). Es wird einfacher, wenn Sie eine Art Trennzeichen haben (d. H. Wenn dies Zeichen sind, puffern Sie jede Zeile und führen Sie Suchen/Ersetzen in einer Zeile aus). Andernfalls müssen Sie es manuell tun, das heißt, lesen Sie eine Reihe von Bytes, sehen Sie, ob es eine Übereinstimmung ODER eine teilweise Übereinstimmung gibt. Wenn es eine teilweise Übereinstimmung gibt, lesen Sie erneut bis zu dem Punkt, an dem Sie entscheiden können, ob Sie ersetzen müssen, geben Sie dann Ihrem Aufrufer die Anzahl der angeforderten Bytes und puffern Sie, was Sie überlesen haben ... @ ArticLord1: Das ist sehr stolz. Schwierig mit Bächen! – GPI

Antwort

0

Ich weiß zu wenig über welche Art von Filterung Sie brauchen. Aber eine der möglichen Lösungen ist es, java.io.FilterInputStream zu erweitern und dort read() und read (byte [] b)