2016-07-27 16 views
1

我試圖將我的PrintStream對象綁定到控制檯的輸出和錯誤流,以便我寫的任何內容都會寫入到我的日誌文件中。如何將PrintStream與System.out和err流聯繫起來

public static void tieOutputStreams(String fileName) { 
    try { 
     File output = new File(fileName); 
     FileWriter writer = new FileWriter(output); 
     writer.close(); 
     outputStream = new TiedOutputStream(output); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    System.setErr(outputStream); 
    System.setOut(outputStream); 
} 

一旦我完成了寫作,我可以重置它回到事情的方式。

public static void resetOutputStreams() { 
    outputStream.close(); 
    System.setErr(System.err); 
    System.setOut(System.out); 
} 

TiedOutputStream類看起來是這樣的:

public class TiedOutputStream extends PrintStream { 
    public TiedOutputStream(File logFile) throws FileNotFoundException { 
     super(logFile); 
    } 

    @Override 
    public void print(Object obj) { 
     super.print(obj); 
     System.out.print(obj); 
    } 

    @Override 
    public PrintStream printf(String format, Object... args) { 
     super.printf(format, args); 
     System.out.printf(format, args); 
     return this; 
    } 

    @Override 
    public void println(Object args) { 
     super.println(args); 
     System.out.println(args); 
    } 
} 

而我的主要方法:

public static void main(String[] args) { 
    try { 
     TieOutputStreams.tieOutputStreams("./sample.log"); 
     System.out.println("Output console"); 
     System.err.println("Error console"); 
     float num = 1.123456f; 
     System.out.printf("A float: %.6f", num); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     TieOutputStreams.resetOutputStreams(); 
    } 
} 

我想上我的兩個日誌文件和系統控制檯(出打印這些語句/ 呃)。由於我不知道的原因,這是行不通的。我很欣賞所有的答案和評論。提前致謝!

我知道有Log4j。但我仍然想這樣做。

+0

這與'FileOutputStream'有什麼關係? – EJP

+0

謝謝,我已經更新了這個問題。 – Raam

回答

0

這並不主要是工作,因爲你沒有保存原始System.out因爲你沒有重載println(String obj)當你調用System.out.println("Output console");你會不會在你重寫,因爲人們期望的方法和對象,有打在PrintStream期望一個String參數

這似乎是工作更具體的方法:

public class TiedOutputStream extends PrintStream { 

    private final PrintStream sout; 
    private final PrintStream serr; 

    public TiedOutputStream(File logFile) throws FileNotFoundException { 
     super(logFile); 
     sout = System.out;//save standard output 
     serr = System.err; 
    } 

    @Override 
    public void print(Object obj) { 
     super.print(obj); 
     sout.print(obj); 
    } 

    @Override 
    public void println(String obj) { 
     super.println(obj); 
     sout.println(obj); 
    } 

    @Override 
    public PrintStream printf(String format, Object... args) { 
     super.printf(format, args); 
     sout.printf(format, args); 
     return this; 
    } 

    @Override 
    public void println(Object args) { 
     super.println(args); 
     sout.println(args); 
    } 

} 

不知道爲什麼tieOutputStreams創建的FileWriter

public static void tieOutputStreams(String fileName) { 
    try { 
     File output = new File(fileName); 
     outputStream = new TiedOutputStream(output); 
     System.setErr(outputStream); 
     System.setOut(outputStream); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

main方法保持不變。您應該更新resetOutputStreams以恢復到原始的outerr。如果我使用這個,我會覆蓋所有來自PrintStream的print *方法。

+0

謝謝。我會嘗試的。 – Raam

+0

現在工作。控制檯輸出雖然打印兩次。 '輸出consoleOutput控制檯 錯誤consoleError控制檯 浮點數:1.123456A浮點數:1.123456' – Raam

+0

可能是因爲您多次使用它,並且您沒有恢復出錯,實際上err – user1121883