1. 序章

このチュートリアルでは、 System.console()System.outの違いについて説明します。

2. System.console()

まず、Consoleオブジェクトを取得するプログラムを作成しましょう。

void printConsoleObject() {
    Console console = System.console();
    console.writer().print(console);
}

インタラクティブ端末からこのプログラムを実行すると、次のような出力が表示されます java.io.Console@546a03af。

ただし、他のメディアから実行すると、コンソールオブジェクトが null になるため、NullPointerExceptionがスローされます。

または、以下のようにプログラムを実行した場合:

$ java ConsoleAndOut > test.txt

次に、ストリームをリダイレクトしているときに、プログラムはNullPointerExceptionもスローします。

Console クラスは、文字をエコーせずにパスワードを読み取るためのメソッドも提供します。

それを実際に見てみましょう:

void readPasswordFromConsole() {
    Console console = System.console();
    char[] password = console.readPassword("Enter password: ");
    console.printf(String.valueOf(password));
}

これにより、パスワードの入力を求められ、入力中に文字がエコーされなくなります。

3. System.out

System.outのオブジェクトを印刷してみましょう。

System.out.println(System.out);

これは次のようなものを返します java.io.PrintStream。

出力はどこからでも同じになります。

System.out は、データを出力ストリームに出力するために使用され、データを読み取る方法はありません。 出力ストリームはファイルなどの任意の宛先にリダイレクトでき、出力は同じままです。

プログラムは次のように実行できます。

$ java ConsoleAndOut > test.txt

これにより、出力がtest.txtファイルに出力されます。

4. 違い

例に基づいて、いくつかの違いを特定できます。

  • System.console()は、インタラクティブ端末から実行すると java .io.Console インスタンスを返しますが、System.outは呼び出しメディアに関係なく、 java.io.PrintStreamオブジェクト
  • System.outSystem.console()の動作は、ストリームをリダイレクトしていない場合と同様です。 それ以外の場合、 System.console()nullを返します
  • 複数のスレッドが入力を求めるプロンプトを表示すると、 Console はそれらのプロンプトを適切にキューに入れますが、System.outの場合はすべてのプロンプトが同時に表示されます

5. 結論

この記事では、 System.console()System.outの違いについて学びました。 Console は、アプリケーションがインタラクティブコンソールから実行されることになっている場合に便利であると説明しましたが、注意して対処する必要のあるいくつかの癖があります。

いつものように、この記事の完全なコードは、GitHubから入手できます。