Java知识积累——同时输出到控制台和指定文件,或直接输出到指定文件

时间:2021-06-27 12:40:17

很多时候的实际需求都不允许我们只是把结果输出到console就可以了,那么怎么把程序运行结果输出到指定文件,以及怎么能同时让其输出到指定文件和console呢?

通过网上搜索过来人的文章,找到了如下解决方法,感谢前人的分享~

1.首先我们需要自己编写一个类,并且继承OutputStream类,重写其write(int b)方法。这个类主要实现创建两条输出流。

 1 import java.io.IOException;
 2 import java.io.OutputStream;
 3 
 4 public class MultiOutputStream extends OutputStream{
 5     
 6     OutputStream output1;
 7     OutputStream output2;
 8     
 9     public MultiOutputStream(OutputStream output1,OutputStream output2){
10         this.output1 = output1;
11         this.output2 = output2;
12     }
13     
14     @Override
15     public void write(int b) throws IOException {
16         // TODO Auto-generated method stub
17         output1.write(b);
18         output2.write(b);
19     }
20     
21 }

 

2.主程序中进行配置

 1     public static void main() throws IOException{  
 2         FileOutputStream propFile = null;
 3         MultiOutputStream multi = null;
 4         
 5         try {
 6             propFile = new FileOutputStream("src/applicationContext.properties");
 7             //设置同时输出到控制台和prop文件
 8             multi = new MultiOutputStream(new PrintStream(propFile),System.out);
 9             System.setOut(new PrintStream(multi));
10             
11             System.out.println("输入任何文字均可~~")
12         } catch (Exception e) {
13             e.printStackTrace();
14         } finally{
15             multi.close();
16             input.close();
17             propFile.close();
18         }
19     } 

 

程序进行到第九行后,但凡是原来只输出到控制台的信息都会同时输出到propFile所指向的文件当中。

当设置了双输出后,如何将输出流重新只指向控制台呢?有两种方法,其一是在开始setOut时,先记录那时的输出流指向,以供后续调用。

 

 

PrintStream console = System.out;

System.setOut(new PrintStream(multi));//变成了双输出

System.setOut(console);//又设置成了之前只输出到控制台的模式

 

其二的方法不是通过之前记录,而是直接重定向到标准输出。

//通用重定向输出流到console,不用之前记录
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));