How to write data to two java.io.OutputStream objects at once?

前端 未结 5 915
野性不改
野性不改 2020-11-27 20:37

I\'m looking for magical Java class that will allow me to do something like this:

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
FileOutputS         


        
5条回答
  •  温柔的废话
    2020-11-27 21:17

    Just roll your own. There isn't any magic at all. Using Apache's TeeOutputStream you would basically use the code below. Of course using the Apache Commons I/O library you can leverage other classes, but sometimes it is nice to actually write something for yourself. :)

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

    Testing with the above class with the following

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

    would print Hello World!Hello World!.

    (Note: the overridden close() could use some care tho' :)

提交回复
热议问题