需求是这样的,我想要截获标准输出流,输出到另一个地方,同时希望保持原有的标准输出流不受影响,相当于把原有的输出流复制成了两份,有办法可以做到吗?

解决方案 »

  1.   

    可以的,在Java中多声明一个输出流就行了
      

  2.   

    有 输出就有输入,楼主最好从输入流着手。而不是输出流,在输入流输入的时候就可以在while循环中处理
    BufferedReader br = new BufferedReader (~~~某个输入流  );
    BufferedWriter bw = new BufferedWriter (~~~某个输出流 );
    String line = "";
    while( (line=br.readLine())!=null ){
       System.out.println(line);//标准输出
       bw.write(line);bw.flush();//其它输出流,如果其它输出流要作相应操作,那就对line切割,重组,查找之后再用bw写入就是了。
    }
      

  3.   


    你说的内容比较绕,我理解你希望能用一个类似于 Writer 或 OutputStream 之类的输出,但是同时可以输出给两个目标,类似于输出的时候就做了克隆。比如同时将内容写进两个不同的文件,对么?如果我理解正确的话,你的要求,Java提供的标准类库没有此类实现。
    需要你自己去包装原始的OutputStream,然后去重写相关的write方法,然后同时写入两个地方,类似于:
    public class MyOutputStream extends OutputStream {
        private OutputStream originOS;
        private OutputStream otherOS;
        public MyOutputStream (OutputStream originOS) {
            this.originOS = originOS;
            this.otherOS = new FileOutputStream("xxxxxxooooo");
        }    public void write(byte data) { // 类似这样,所有函数都需要重写
            originOS.write(data); // 写入原始流
            otherOS.write(data); // 写入新流
        }
    }
      

  4.   

    恩,正是此意。看来还得自己写一个OutputStream。所有方法都必须重写吗?是否有一个方法是共同用来进行最终的输出的?
      

  5.   

    对4楼的方法,你是想用通用的方式得到复制出一个输出流,而不想具体到让程序知道一个是FileOutputStream?
      

  6.   


    看你包装的目标,如果是OutputStream,则OutputStream所定义的函数都需要重写,否则就有可能漏杀。其实也不多,总共就3个函数:
     void write(byte[] b)  // 如果非要偷懒可以不重写这个,它是调用第二个实现的
     void write(byte[] b, int off, int len) 
     void write(int b) 
      

  7.   


    但是这个好像不符合楼主的问题了。楼主是想把一个输出流直接操作,改变方向。不过确实API中没有提供此方法。但是你的那个方法不是又new了一个新的流了吗??个人觉得是脱裤子放屁。
    多此一举。