標準出力の正体はPrintStream
今回は、フリーウェアというより、「フリーウェア作りに役立つツール」を作ってみましょう。
Javaでは、コンソールプログラムなどで使う「標準出力」というものが用意されています。System.out.printlnなどで出力される、あれですね。ちょっとしたことをこれで出力させるのは大変便利ですし、何か例外が発生したときもcatch内でprintStackTraceしておけば原因を探るのに役立ちます。
これはとても便利なんですが、GUIを使ったプログラムでは使えないという欠点があります。まぁ、コマンドプロンプトなどからプログラムを起動すればプロンプト画面に出力できますが、JARファイルなどにまとめダブルクリックで起動するようなプログラムでは、標準出力が利用できません。「GUIプログラムで標準出力を画面に表示できたらなぁ」と思ったことのある人はきっと多いんじゃないでしょうか。
一般に「標準出力」といっているものは、実は2つあります。System.out(標準出力)とSystem.err(エラー出力)です。System.outはプログラマが意図的に何かを標準出力に書き出すのに用いられ、System.errは例外が発生したときなどにエラーメッセージの出力などに用いられます。通常、これらは同じ出力先(コマンドプロンプト画面など)に書き出されるので区別されないことが多いのですが、Systemクラスにあるこの2つのフィールドに用意されているオブジェクトが、標準出力の正体だったのです。
SystemにあるoutとerrにはPrintStreamが設定されており、これを使って標準出力への出力が行われています。 |
これらはいずれもjava.io.PrintStreamのフィールドとして用意されています。そしてSystemクラスには、これらのフィールドにインスタンスを設定するためのメソッドも用意されているのです。
System.setOut([PrintStream]);
System.setErr([PrintStream]);
ということは? そう、独自のPrintStreamインスタンスを用意し、それをこのメソッドでSystemに設定してやれば、標準出力の出力先を独自のものに変更することが可能というわけです。これが「標準出力設定の基本」です。
問題は、「PrintStreamに書き出したものを自動的にGUIコンポーネントに表示させるにはどうしたらいいか?」ということでしょう。これは、オリジナルのGUIコンポーネントを定義すれば解決できそうですね。