今週はjava.ioパッケージに新たに加わったConsoleクラスを紹介していきます。

Consoleクラスは,文字通りコンソールを意味しており,コンソールからの入出力を扱うことができます。WindowsのコマンドプロンプトやUNIXのターミナルでJavaを起動した場合,コンソールは標準入力と標準出力を使用して入出力を行います。

コンソールからの入出力

まずは単純な入出力を試してみます。

サンプルのソース ConsoleSample.java

このサンプルは入力された文字列を,そのまま出力します。

    public ConsoleSample() {
        Console console = System.console();
 
        for (int i = 0;; i++) {
            String line = console.readLine("入力 %d: ", i);
            if (line == null) {
                break;
            }
 
            console.printf("入力されたのは: %s%n", line);
        }
    }

Consoleオブジェクトを取得するにはSystem.consoleメソッドを使用します。コンソールがない場合はnullが返ります。

入力は行単位に行ないます。入力のために用意されているのはreadLine()とreadLine(String fmt, Object... args)の2つのメソッドです。後者を使用すると,入力の前に任意の文字列を表示することができます。第1引数のfmtはjava.util.Formatterくと同じ書式になります。

戻り値は入力された文字列です。ストリームの最後まで達してしまった場合はnullが返ります。

出力はprintfもしくはformatメソッドです。この2つのメソッドは名前は違いますが,両方とも引数も,処理も同一です。内部的にはFormatterクラスのformatメソッドを呼びだしています。

それでは実行してみましょう。

C:\>java  ConsoleSample
入力 0: Hello, World!
入力されたのは: Hello, World!
入力 1: Hello, Japan!
入力されたのは: Hello, Japan!
入力 2: こんにちは,世界!
入力されたのは: こんにちは,世界!は 0
入力 3: 

ここまで説明した機能であれば,標準入力System.inと標準出力System.outを使用すれば可能です。

では,もう1つSystem.inでは対応できない機能を紹介しましょう。

パスワードの入力

GUIでパスワードを入力する場合,JPasswordFieldクラスを使用することで,入力した文字を隠すことができます。

では,コンソールでパスワードを入力する場合はどうしましょう?

標準入力System.inを使用すると,入力された文字がそのまま表示されてしまいます。これではパスワードなど秘匿しなければいけない情報が見えてしまいます。

Consoleクラスを使用すれば,入力文字のエコーバックを抑制することができ,パスワードの入力も可能になります。

サンプルのソース PasswordSample.java

使い方はreadLineメソッドのかわりにreadPasswordメソッドを使用するだけです。ただし,戻り値はStringオブジェクトではなく,charの配列になります。

  public PasswordSample() {
      Console console = System.console();

      for (int i = 0;; i++) {
          char[] password = 
              console.readPassword("パスワード %d: ", i);
          if (password == null) {
              break;
          }

          console.printf("パスワード: ");
          for (int j = 0; j < password.length; j++) {
              char c = password[j];
              console.printf("%c", c);

              password[j] = '\0';
          }
          console.printf("%n");
      }
  }

これを実行してみましょう。

C:\>java  PasswordSample
パスワード 0:
パスワード: sakuraba
パスワード 1:
パスワード: yuichi
パスワード 2:

このようにエコーバックは行なわれずに,パスワードを入力することができます。

パスワードを扱う場合,上記のコードの青字で示したように,使用後は速やかに文字を置き換えるようにしましょう。

サーバなどGUIが使用できない環境も多々あります。そのような場合でも,Consoleクラスを使用すれば安全にパスワードを入力させることが可能です。ぜひご活用ください。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

5月の今月の櫻庭でツバメのことを書きました。その後,4羽のヒナが生まれ,成長し,巣立ちしてしまいました。もちろん自分が飼っていたわけではありませんが,巣立ちしてしまった後は一抹の寂しさを感じていました。

ところが,その巣のそばにもう1つツバメの巣があることを最近発見しました。こちらの巣はまだ卵を温めているところです。通勤途中にツバメの様子をうかがうのが,毎日の日課になっています。

生まれてすぐの頃 羽が抜け替わりだす もうすぐ巣立ち
生まれてすぐの頃 羽が抜け替わりだす もうすぐ巣立ち