2017-02-16 3 views
1

Ich habe den folgenden Anwendungsfall:Wie reduziere ich das Schreiben zwischen InputStreams und OutputStreams?

  • Lesen von Service InputStream
  • der InputStream gehen und ein paar Sachen ersetzen, das Ergebnis in OutputStream
  • jetzt gespeichert Ich muss auf die Arbeit mit einem InputStream gehen erstellt von der OutputStream

Dies ist der Code, den ich gerade jetzt:

InputStream resourceStream = service.getStream(); 
ByteArrayOutputStream output = new ByteArrayOutputStream(); 
replace(resourceStream, output, ...); 
resourceStream.close(); 
resourceStream = new ByteArrayInputStream(out.toByteArray()); 

Eine Menge von Verschieben und Konvertieren von Streams, also habe ich mich gefragt, ob es eine sauberere Lösung gibt. Vielleicht einige OutputStream, die als InputStream verwendet werden können, oder eine OutputStream, die eine enthält, in die der Inhalt geschrieben wird.

+1

Ein Stream ist ein Stream. Das bedeutet, dass es sich um eine seriell zugängliche, nicht zurückkehrende Bytefolge handelt. Ein besserer Weg wäre, ein Element aus dem ursprünglichen Stream zu nehmen, es durch alle Verarbeitungsstufen zu leiten und es erst dann in einen endgültigen Ausgabestrom zu schreiben, wenn dies erforderlich ist. – RealSkeptic

+0

Also sollte dieser OutputStream Daten von InputStream nehmen, sobald sie dort erscheinen? –

+0

@PavloPlynko mehr wie: Daten sollten im "neuen" 'InputStream' sein, sobald es in den' OutputStream' geschrieben wird. –

Antwort

1

Egal, wie gut Ihre Idee, ein einzelnes Objekt mit Daten aus, die Implementierungen von InputStream und OutputStream vorgenommen wurde als „Klassen“ und nicht die „Schnittstellen“ zu schreiben und zu lesen. Aufgrund der Tatsache, dass in Java eine einzelne Unterklasse nicht mehrere Super-Klassen erweitern kann, bleibt der Traum, sowohl Eingabe- als auch Ausgabe-Stream-Operationen in einer einzigen Klasse zu haben, nur ein Traum.

Das heißt, die einzige andere Option für Programmierer wäre, eine Klasse zu erstellen, die sowohl InputStream als auch OutputStream für ihre Clients verfügbar macht. Etwas Ähnliches wie das, was java.net.Socket tut. Es exponiert eine getInputStream und eine getOutputStream, die auf einer logischen Ebene aus dem gleichen "Socket" liest und schreibt.

So können Sie etwas tun:

public class IOStreamWrapper { 

    byte[] streamData; 

    public InputStream getInputStream() { 
     // return an inputstream that reads from streamData[] 
    } 

    public OutputStream getOutputStream() { 
     // return an outputstream that writes to streamData[] 
    } 

} 

Referenzen:

Java InputStream

Java OutputStream


hoffe, das hilft!

Verwandte Themen