じゃじゃ馬ならし

 

パスワードを隠しましょう - Console

コンソールからの入出力

コンソール (コマンドプロンプトでもターミナルでも何でもいいのですが) からの入出力には、通常 System.out/System.in が使用されます。

まぁ、それはそれでいいのですが、コンソール専用の入出力クラスができました。名前はそのまま java.io.Console クラスです。

サンプルのソースコード ConsoleSample1.java

Console オブジェクトを取得するのは System.console メソッドです。なぜ getConsole という名前じゃないんでしょうね。

import java.io.Console;
import java.util.Date;
 
public class ConsoleSample1 {
    public ConsoleSample1() {
        Console console = System.console();
 
        console.format("Today is %tF%n", new Date());
 
        String input = console.readLine("[%1$tk:%1$tM:%1$tS]input> ", new Date());
        System.out.println(input);
    }
 
    public static void main(String[] args) {
        new ConsoleSample1();
    }
}

 

出力には printf メソッドと format メソッドが用意されています。実際には printf メソッドは内部的に format メソッドをコールしているだけなので、両方とも同じものと考えることができます。

このメソッド名から分かると思うのですが、出力の整形をおこなうことができます。整形には java.util.Formatter クラスが使用されています。

入力は readLine メソッドです。引数なしのものと、引数ありのものがあります。引数なしはそのまま 1 行、入力するメソッドです。

引数ありは第 1 引数が format, 第 2 引数以下 (可変長引数) が args となっているので、C でいうところの scanf みたいなものかと思ったのですが、ちがうようです。

上のサンプルを動作させてみればすぐに分かります。

C:\temp>java ConsoleSample1
Today is 2005-10-24
[5:32:11]input> abc
abc
 
C:\temp>

 

input> の後の abc が私が入力した文字です。

ようするに readLine の引数はプロンプトを表示する前の部分を出力して、その後入力させるというメソッドのようです。ちょっと紛らわしいですね。

 

パスワードを入力する

これだけだと Console クラスはたいして便利ではないのですが、役に立つ場面もあるのです。

それはパスワードの入力です。

System.in を使ってしまうとパスワードが丸見えになってしまうのが問題だったわけです。ところが、Console クラスを使うとパスワードを隠してくれます。

サンプルのソースコード ConsoleSample2.java

 

import java.io.Console;
import java.util.Date;
 
public class ConsoleSample2 {
    public ConsoleSample2() {
        Console console = System.console();
 
        char[] password = console.readPassword();
        System.out.println(password);
 
        password = console.readPassword("[%1$tk:%1$tM:%1$tS]password> ", new Date());
        System.out.println(password);
    }
 
    public static void main(String[] args) {
        new ConsoleSample2();
    }
}

パスワードの入力には readPassword メソッドを使用します。このメソッドも readLine メソッドと同様に引数なしとありの 2 つがあります。

さっそく、実行してみましょう。

C:\temp>java ConsoleSample2

abc
[16:13:32]password>
efg
 		
C:\temp>

abc の前の行で、abc と入力しているのですが、何も表示されません。アスタリスク (*) が表示されるかと思ったのですが、それも表示されないようです。これだとちょっととまどうかも。

 

おわりに

Cosole クラスはパスワードの入力ぐらいにしか使えそうもありませんが、そういうものだと割り切れば便利かもしれません。でも、本当に使うかなぁ?

 

(Nov. 2005)