Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将数据同时写入两个java.io.OutputStream对象?_Java_Io_Outputstream - Fatal编程技术网

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

如何将数据同时写入两个java.io.OutputStream对象?,java,io,outputstream,Java,Io,Outputstream,我正在寻找神奇的Java类,它可以让我做如下事情: ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); FileOutputStream fileStream = new FileOutputStream(new File("/tmp/somefile")); MultiOutputStream outStream = new MultiOutputStream(byteStream, fileStream); ou

我正在寻找神奇的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中的
OutputStream
s的
tee
。有什么想法吗


谢谢

自己滚吧,基本上没什么大不了的。使用
ArrayList
或当今流行的任何东西来存储您想要的所有流,并编写
write
方法来循环所有流,对每个流进行写入

试试。

自己滚吧。根本就没有什么魔力。使用您将基本上使用下面的代码。当然,使用ApacheCommons I/O库,您可以利用其他类,但有时为自己编写一些东西是很好的

使用上述类进行测试,并执行以下操作

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();
}
将打印
你好,世界!你好,世界


(注意:被重写的
close()
可能需要一些注意:)

刚刚找到这个线程,因为我不得不面对同样的问题。 如果有人想查看我的解决方案(java7代码):


写入我的终端屏幕和两个工作正常的日志。

I/O中的任何内容都是微不足道的。即使一开始看起来是这样。这并不能真正回答如何同时给他们所有人写信的问题。@Kevin不,谢谢。for each循环不能解决如何同时写入它们的问题。A for each将按顺序写入流,它们不会并行写入(即同时写入)。@ZettaSuro因此会在线程中生成它们,但如果文件位于同一物理磁盘上,速度不会更快,而且可能会更慢,我很确定这不是OP的意思。它确实在一个方法调用中写入所有流,这是当前的问题。@ZettaSuro每次都是一个方法调用,而不是一个循环。设置流一次以写入所有您想要的流,然后只
teeos.write(stuff)
。写入应该是同步的。您可以简化这一过程。让它扩展
过滤器输出流
;用
super(out)
构建它;摆脱
out
成员;并将所有的
更改为
super.
引用。@Dave取决于用例。EJP我更喜欢这种方式,但那也行。@DaveNewton介意解释一下你关于“写操作应该同步”的评论吗?它是强制性的吗?常规java io流是否使用同步关键字?@Whome不,它们不使用。这里的问题(正如我五年前所看到的)是,由于存在多个写入,您可能希望它们作为单个单元执行,以避免潜在的奇怪输出结果排序。可能是错误的。我试图使用您的代码,但是它给了我一个编译错误-类型系统中的方法setOut(PrintStream)不适用于参数(MultiOutputStream)@Raj,因为
OutputStream
不是
PrintStream
,而是相反。
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();
}
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());
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();
    }
}

}
System.setOut(multiOutputStream);