今週は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つツバメの巣があることを最近発見しました。こちらの巣はまだ卵を温めているところです。通勤途中にツバメの様子をうかがうのが,毎日の日課になっています。
|