如何一次将数据写入两个java.io.OutputStream对象?

我正在寻找神奇的Java类,这将允许我做这样的事情:

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

基本上,我想在Java中使用OutputStreamtee 。 有任何想法吗?

谢谢!

试试Apache Commons TeeOutputStream 。

滚动你自己。 根本没有任何魔法。 使用Apache的TeeOutputStream你基本上可以使用下面的代码。 当然使用Apache Commons I / O库可以利用其他类,但有时候为自己编写一些东西真是太好了。 🙂

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

使用以上类进行测试

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

会打印Hello World!Hello World!

(注意:重写的close()可以使用一些关心’:)

刚发现这个post因为我不得不面对同样的问题。 如果有人想看我的解决方案(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(); } } } 

到目前为止工作正常,只测试了一些基本操作,例如从System.out Stream设置MultiOutputStream和2个PrintStream,每个写入一个单独的日志。 我用了

 System.setOut(multiOutputStream); 

写入我的终端屏幕和两个没有任何问题的日志。

滚动你自己,它基本上是微不足道的。 使用ArrayList或者现在流行的任何流来存储你想要的所有流,并编写write方法来遍历所有流,写入每个流。

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