2015-12-13 48 views
0

我经历了java API文档。我弄了一些函数和类,发现了一些奇怪的东西。我写的下面的代码不是将标准输出流设置为默认值(System .OUT)。 起初,我将标准输出目标设置为一个文件,然后我尝试重置它,但它继续写入文件。在java中将标准输出流设置为默认值

try 
    { 

     file=new FileOutputStream("mamamia.txt",true); 
     //j=new BufferedOutputStream(file); 
     j=new PrintStream (file); 
     //byte[] b={49,50,44,67,44,23,57,32}; 
     //j.write(b,0,5); 
     System.setOut(j); 
     System.out.println("hey mama mia"); 
     System.out.println("hello gigs"); 


     PrintStream j1=new PrintStream (System.out); 
     System.setOut(j1); 
     System.out.println("Hey bro"); 

     j.flush(); 
     file.flush(); 
     file.close(); 
     j.close(); 
    } 

“嘿兄弟”是越来越印在file.Why是它不会恢复为默认? Prinstream构造函数查找类型OutputStream.Since,因为PrintStream是OutputStream的一个间接子类,我直接传递了System.out.It不会显示任何错误,唯一的问题是它不会返回到默认值。 有人可以帮忙吗?

+0

'PrintStream的J1 =新的PrintStream(System.out的);'你有以前将System.out设置为PrintStream'j',以便它不会得到默认值 – Yazan

+0

@Yazan 我将它设置回j1,它指向default-(System.out)。 为什么我无法更改它? –

+1

重点是,你已经将System.out从默认更改为'j',所以现在当你调用System.out时它将不是默认值。 – Yazan

回答

1

你在做什么,在大大简化:

stdout = file; 
stdout = stdout; 

所以毫不奇怪它不是设置为原始。

您需要将原始标准输出流保留在临时变量中,然后将其分配回System.out。事情是这样的:

PrintStream originalStdout = System.out; 
System.setOut(j); 
// do your printing... 
// and revert 
System.setOut(originalStdout); 
+0

非常感谢。我明白了! –

1

System.setOut(j1);

这里要设置的System.out它已被链接到的PrintStream,这是文件中的一个。

你应该先存储原始的System.out的PrintStream,然后reaffect这种原始的PrintStream一旦你完成,如:

try 
    { 

     file=new FileOutputStream("mamamia.txt",true); 
     //j=new BufferedOutputStream(file); 
     j=new PrintStream (file); 
     //byte[] b={49,50,44,67,44,23,57,32}; 
     //j.write(b,0,5); 
     PrintStream originalStream = System.out; 
     System.setOut(j); 
     System.out.println("hey mama mia"); 
     System.out.println("hello gigs"); 


     System.setOut(originalStream); 
     System.out.println("Hey bro"); 

     j.flush(); 
     file.flush(); 
     file.close(); 
     j.close(); 
    } 
+0

PrintStream originalStream = System.out; 此声明将originalStream中的默认设置保存为j.right之前保存了默认值? –