Come scrivere i dati su due oggetti java.io.OutputStream contemporaneamente?

Sto cercando una magica class Java che mi permetta di fare qualcosa del genere:

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

Fondamentalmente, voglio tee per OutputStream s in Java. Qualche idea?

Grazie!

Prova l’ Apache Commons TeeOutputStream .

Basta tirare il tuo. Non c’è affatto magia. Usando TeeOutputStream di Apache si utilizza fondamentalmente il codice qui sotto. Ovviamente usando la libreria I / O di Apache Commons puoi sfruttare altre classi, ma a volte è bello scrivere qualcosa per te. 🙂

 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(); } } } 

Test con la class di cui sopra con il seguente

 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(); } 

stamperei Hello World!Hello World! .

(Nota: la close() forzata close() potrebbe usare un po ‘di attenzione 🙂

Ho appena trovato questo thread perché ho dovuto affrontare lo stesso problema. Se qualcuno vuole vedere la mia soluzione (codice 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 out; public MultiOutputStream(List outStreams) { this.out = new LinkedList(); for (Iterator 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 i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.write(arg0); } } @Override public void write(byte[] b) throws IOException{ for (Iterator 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 i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.write(b, off, len); } } @Override public void close() throws IOException{ for (Iterator i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.close(); } } @Override public void flush() throws IOException{ for (Iterator i = out.iterator(); i.hasNext();) { OutputStream var = (OutputStream) i.next(); var.flush(); } } } 

Funziona bene finora, ho appena testato alcune operazioni di base, ad esempio impostando un MultiOutputStream da System.out Stream e 2 PrintStreams scrivendo ciascuno in un log separato. ero solito

 System.setOut(multiOutputStream); 

scrivere sul mio schermo terminale e due log che hanno funzionato senza problemi.

Roll your own, è fondamentalmente banale. Usa un ArrayList o qualunque cosa sia popolare al giorno d’oggi per memorizzare tutti i flussi che vuoi e scrivi il metodo di write per aggirarli tutti, scrivendo a ciascuno di essi.

 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());