streams sirve serializacion salida que para objetos los leer identificar flujos fichero escribir entrada deserializacion definicion archivos java io outputstream

sirve - ¿Cómo escribir datos en dos objetos java.io.OutputStream a la vez?



serializacion y deserializacion en java (5)

Estoy buscando una clase de Java mágica que me permita hacer algo como esto:

ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); FileOutputStream fileStream = new FileOutputStream(new File("/tmp/somefile")); MultiOutputStream outStream = new MultiOutputStream(byteStream, fileStream); outStream.write("Hello world".getBytes());

Básicamente, quiero tee para OutputStream s en Java. ¿Algunas ideas?

¡Gracias!


Acabo de encontrar este hilo porque tuve que enfrentar el mismo problema. Si alguien quiere ver mi solución (código java7):

package Core; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class MultiOutputStream extends OutputStream { private List<OutputStream> out; public MultiOutputStream(List<OutputStream> outStreams) { this.out = new LinkedList<OutputStream>(); for (Iterator<OutputStream> i = outStreams.iterator(); i.hasNext();) { OutputStream outputStream = (OutputStream) i.next(); if(outputStream == null){ throw new NullPointerException(); } this.out.add(outputStream); } } @Override public void write(int arg0) throws IOException { for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.write(arg0); } } @Override public void write(byte[] b) throws IOException{ for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.write(b); } } @Override public void write(byte[] b, int off, int len) throws IOException{ for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.write(b, off, len); } } @Override public void close() throws IOException{ for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.close(); } } @Override public void flush() throws IOException{ for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.flush(); } } }

Funciona bien hasta ahora, solo probé algunas operaciones básicas, por ejemplo, configurando un MultiOutputStream desde System.out Stream y 2 PrintStreams cada escritura en un registro separado. solía

System.setOut(multiOutputStream);

para escribir en mi pantalla de terminal y dos registros que funcionaron sin problemas.



Rueda la suya, es básicamente trivial. Use una ArrayList<OutputStream> o lo que sea popular en la actualidad para almacenar todas las secuencias que desee y escriba el método de write para hacer un bucle sobre todas ellas, escribiendo a cada una.


Sólo tira el tuyo. No hay magia en absoluto. Usando el TeeOutputStream de Apache, básicamente usaría el código a continuación. Por supuesto, al usar la biblioteca de E / S de Apache Commons puede aprovechar otras clases, pero a veces es bueno escribir algo para usted. :)

public final class TeeOutputStream extends OutputStream { private final OutputStream out; private final OutputStream tee; public TeeOutputStream(OutputStream out, OutputStream tee) { if (out == null) throw new NullPointerException(); else if (tee == null) throw new NullPointerException(); this.out = out; this.tee = tee; } @Override public void write(int b) throws IOException { out.write(b); tee.write(b); } @Override public void write(byte[] b) throws IOException { out.write(b); tee.write(b); } @Override public void write(byte[] b, int off, int len) throws IOException { out.write(b, off, len); tee.write(b, off, len); } @Override public void flush() throws IOException { out.flush(); tee.flush(); } @Override public void close() throws IOException { try { out.close(); } finally { tee.close(); } } }

Probando con la clase anterior con lo siguiente

public static void main(String[] args) throws IOException { TeeOutputStream out = new TeeOutputStream(System.out, System.out); out.write("Hello world!".getBytes()); out.flush(); out.close(); }

imprimiría Hello World!Hello World! .

(Nota: el close() anulado close() podría ser más cuidadoso aunque :)


final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); final FileOutputStream fileStream = new FileOutputStream(new File("/tmp/somefile")); OutputStream outStream = new OutputStream() { public void write(int b) throws IOException { byteStream.write(b); fileStream.write(b); } }; outStream.write("Hello world".getBytes());