2016-07-27 1 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 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(); 
    } 
} 

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); 
    } 
} 

そして、私の主な方法/エラー)。私が知らない理由のために、これは動作していません。私はすべての答えとコメントに感謝します。前もって感謝します!

私はLog4jがあることを知っています。しかし、私はとにかくこれをやりたい。

+0

これは 'FileOutputStream'と何が関係していますか? – EJP

+0

ありがとう、私は質問を更新しました。 – Raam

答えて

0

System.outを保存していなかったので、これは主に動作しないと、あなたがprintln(String obj)をオーバーライドしていなかったので、あなたがSystem.out.println("Output console");呼び出すときにあなたがそこに1つが期待するので、あなたがオーバーライドするメソッドおよびオブジェクトにヒットしません。 String引数これが動作しているようです

見込んPrintStreamで、より具体的な方法は次のとおりです。わからない

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の方法は同じです。元のouterrに復元するには、resetOutputStreamsを更新する必要があります。これを使用する場合は、すべてのprint *メソッドをPrintStreamからオーバーライドします。

+0

ありがとうございます。私はそれを試みます。 – Raam

+0

それは今働いています。コンソール出力は2回印刷されます。 '出力コンソール出力コンソール エラーconsoleErrorコンソール 浮動小数点:1.123456A浮動小数点:1.123456' – Raam

+0

実際には複数回使用したため、復元してエラーが発生しなかった – user1121883

関連する問題