2011-03-17 100 views
30

我知道有在Java函數使用System.setOut方法標準輸出流設置到任何用戶定義的值..重置標準輸出流

但有復位標準輸出到一個這是任何方法先存儲還是標準輸出?

回答

63

您可以通過FileDescriptor.out獲得標準輸出的文件描述符。要重置標準輸出打印到控制檯,你做

System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); 

另一種方法是簡單地堅持原來的對象,如下所示:

PrintStream stdout = System.out; 
System.setOut(new PrintStream(logFile)); 

// ... 

System.setOut(stdout);     // reset to standard output 
22

這是一個老問題,但它變成了在谷歌搜索中,我想改正它。你可以通過使用FileDescriptor類來獲得它。調用new PrintStream(new FileOutputStream(FileDescriptor.out)))應該會給你一些打印到標準輸出的東西。

import java.io.FileDescriptor; 
import java.io.FileOutputStream; 
import java.io.PrintStream; 


public static void main(String [] args) { 
    System.err.println("error."); 
    System.out.println("out."); 
    System.setOut(System.err); 
    System.out.println("error?"); 
    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); 
    System.out.println("out?"); 
} 
+0

如何走到這是不是upvoted更多... – Jas 2013-12-24 10:38:31

+1

你能澄清,如果接受的答案是不正確(即,如果'System.setOut(標準輸出);'按預期工作)?您的方法是否有益於簡單存儲原始流?另外,我注意到'System.out'等都被標記爲'final',好奇你是否可以提供有關Java如何處理'setOut()'的內幕。 – dimo414 2014-06-09 04:51:34

+1

'System.out'和'System.err'由底層本機C代碼處理。它們被標記爲「final」,以便在虛擬機的本地部分「注意到它們」時不改變它們的指針值。提供的'setOut()'方法需要讓本地部分調整其內部引用。 – ksmonkey123 2014-11-24 10:01:33