有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何将数据写入两个java。木卫一。一次输出流对象?

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

谢谢


共 (5) 个答案

  1. # 1 楼答案

    我刚找到这条线,因为我必须面对同样的问题。 如果有人想查看我的解决方案(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();
        }
    }
    
    }
    

    到目前为止工作正常,只是测试了一些基本操作,例如从系统设置多输出流。out Stream和2个PrintStreams各写入一个单独的日志。 我曾经

    System.setOut(multiOutputStream);
    

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

  2. # 3 楼答案

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

  3. # 4 楼答案

    你自己滚吧。根本就没有什么魔力。使用Apache's TeeOutputStream基本上可以使用下面的代码。当然,使用ApacheCommons 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()可能需要一些注意:

  4. # 5 楼答案

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