2012-01-03 11 views
38

の戻り値の型がVOIDの1つの関数があり、コンソールに直接出力します。コンソール出力をJavaの文字列にリダイレクト

しかし、私はそれに取り組むことができるように文字列で出力が必要です。

戻り値の型で関数を変更することはできませんが、出力を文字列にリダイレクトする必要があります。

どのようにJAVAでリダイレクトできますか?関数はSystem.outに印刷されている場合は、あなたが使用して、その出力をキャプチャすることができ

は、文字列に標準出力をリダイレクトに関する多くの質問がありますが、彼らは唯一のユーザーから取られた入力と、いくつかの機能のない出力...

答えて

75

をリダイレクトSystem.setOutSystem.outPrintStreamに変更する方法。 ByteArrayOutputStreamに接続されたPrintStreamを作成した場合は、出力をStringとして取り込むことができます。

例:

// Create a stream to hold the output 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    PrintStream ps = new PrintStream(baos); 
    // IMPORTANT: Save the old System.out! 
    PrintStream old = System.out; 
    // Tell Java to use your special stream 
    System.setOut(ps); 
    // Print some output: goes to your special stream 
    System.out.println("Foofoofoo!"); 
    // Put things back 
    System.out.flush(); 
    System.setOut(old); 
    // Show what happened 
    System.out.println("Here: " + baos.toString()); 

このプログラムはプリントだけで1行:

Here: Foofoofoo! 
+4

終了したら、System.out.flush()を呼び出してから、System.outを通常の(または、もっと正確には)System.outに戻してください。 @Ernestがそれを彼のコードに追加したのが分かります。 – user949300

+3

また、この方法(これを同期させることで解決できる)ではなく、stdoutに出力する他のコードでも、スレッドの問題が発生することを忘れないでください。 'baos.toString()'は簡単に '' Foofohello worldofoo 'になります。 '' – yshavit

+0

@Ernest:ありがとうございました... – SRK

15

ここではConsoleOutputCapturerという名前のユーティリティクラスです。それは出力が既存のコンソールに行くことができますが、シーンの後ろでは出力テキストを捕捉し続けます。開始/停止方法でキャプチャするものを制御できます。つまり、startを呼び出してコンソール出力のキャプチャを開始し、キャプチャが完了するとstopメソッドを呼び出すことができます。このメソッドは、start-stop呼び出し間の時間ウィンドウのコンソール出力を保持するString値を返します。このクラスはスレッドセーフではありません。

+0

素晴らしい作品です! –

+1

本当に素敵な解決策ですが、私はもう少し追加したいと思いますが、すべてのリソースを解放するためにnullに設定する直前に、stop()メソッドのbaosストリームでclose()メソッドを呼び出します。 – davidgale

+0

完璧な仕事! :) – Developer66

関連する問題