前回は標準入力から文字列を入力することができました。ところでターミナルでプログラムとやりとりするほとんどの場合には「〜を入力してください」と出力してからユーザーからの入力を受け取ります。このような一連の処理を受け持つクラスを作成して今後のプログラムでは入出力の処理を楽にできるようにしたいと思います。
標準入出力クラスの作成
まずクラスを作ります。変数には入力内容を取得するBufferedReaderクラスと出力内容を表示させるPrintStreamクラスを宣言します。PrintStreamの変数はSystem.outをそのまま参照しているだけです。System.outはどこからでもstaticにアクセスできますが拡張性を考え別な場所にも出力できるように変数にしておきます。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; public class TerminalUtil { BufferedReader in; PrintStream out; public TerminalUtil() { in = new BufferedReader(new InputStreamReader(System.in)); out = System.out; } }
文字列取得メソッド
まず文字列を取得するメソッドを追加しましょう。文字列は1文字以上入力した場合のみ受け付けることにします。
- メソッド名はreadString
- 引数は入力を促すメッセージ
- 戻り値は取得した文字列
処理の流れは以下の通りです。
- 引数から受け取ったメッセージを出力する。
- 文字列を取得する。
- 空文字の場合は警告メッセージを出力して先頭に戻る。
- 取得した文字列が1文字以上の場合には戻り値としてその値を返しメソッドを抜ける。
では実際に作ってみましょう。
/** * 標準出力から文字列を取得する * @param message * @return */ public String readString(String message) { while(true){ //メッセージを出力 out.print(message + ">"); //入力を取得する String str; try{ str = in.readLine(); }catch(IOException e){ //例外発生時にはメッセージを出力してやり直す out.println(e.getMessage()); continue; } //空文字の場合は警告してやり直し if(str.isEmpty()){ out.println("なにも入力がありません。"); continue; } //取得した文字を返す return str; } }
コメントを書いておくと後から見た時に修正する場所を見つけやすいので記述しておきましょう。コメントは//でその行の終わりまでを処理と関係ない文字列とします。複数行にまたがる時には/*と*/で挟んでください。
またBufferedReaderのreadineはIOExceptionという例外を投げることがあるのでtry-catchで囲います。catchに来た場合には例外のメッセージを出力してwhileの先頭に戻します。
ではmainメソッドを作り実行しましょう。
public static void main(String[] args){ TerminalUtil terminalUtil = new TerminalUtil(); String name = terminalUtil.readString("名前を入力してください。"); System.out.println("あなたは" + name + "さんですね。"); }
以下実行結果です。最初は何も入力せずにEnterキーを押しています。
名前を入力してください。> なにも入力がありません。 名前を入力してください。>ベルジェ あなたはベルジェさんですね。
以下続きます。