パスワードを隠しましょう - 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)