web-dev-qa-db-ja.com

2つの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のteesにはOutputStreamが必要です。何か案は?

ありがとう!

34
daveslab

Apache Commons TeeOutputStream を試してください。

40
Dave Newton

自分で巻いてください。魔法はまったくありません。 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()は、いくつかの注意を払う可能性があります:)

22

私は同じ問題に直面しなければならなかったので、ちょうどこのスレッドを見つけました。誰かが私の解決策(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();
    }
}

}

これまでのところ正常に動作し、基本的な操作をテストしただけです。 System.outストリームと2つのPrintStreamsからMultiOutputStreamを設定し、それぞれを個別のログに書き込みます。使った

System.setOut(multiOutputStream);

端末画面と2つのログに書き込むと問題なく動作しました。

3
Lejon Doering

自分で転がしてください、それは基本的に簡単です。 ArrayList<OutputStream>または必要なすべてのストリームを格納し、writeメソッドを記述してそれらすべてをループし、それぞれに書き込むために現在人気のあるもの。

2
Kevin
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());
0
Daniel De León