2015-12-13 45 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之前保存了默認值? –