キーボードからの入力


ターミナルウィンドウで起動した java プログラムは,System.out.print, System.out.printlnで文字列や数字を出力できる.それでは,キーボードから 文字列や数字を入力して変数に代入するのはどうすればいいのだろうか?

教える側からすると困ったことだが,Java言語では一行入力するというだけで も,結構やっかいな手続きが必要になっている.これは,以下のような理由に よる.

どの位やっかいか,単純に名前を読み込んで表示するプログラムを書いてみ る.
import java.io.*; // 入力に関するクラスを使う時は必要
class YourName{
   // throws IOException で内部で入出力エラーが起きる可能性があることを示す
  public static void main(String[] args) throws IOException{
  // 入力をするためには,System.inからBufferedReaderを作らなくてはいけない
    BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
    // 文字列型(String)の変数 family, given を定義
    String family,given;
    System.out.println("名字を入力してください> ");
    // BufferedReader dから一行読み込んだ文字列を familyに入れる.
    family=d.readLine();
    System.out.println("名前を入力してください> ");
    // BufferedReader dから一行読み込んだ文字列を familyに入れる.
    given=d.readLine();
    // 表示する.
    System.out.println("あなたの名前は"+family+" "+given+"です");
  }
}
このプログラムをYourName.javaというファイル名で保存して,
javac YourName.java
でコンパイルし,javaコマンドで実行してみると
ux103$ java YourName
名字を入力してください> TANAKA
名前を入力してください> Tetsuro
あなたの名前はTANAKA Tetsuroです
のように実行できる.

ここで,

import java.io.*;
は,入出力に関するクラス(ここでは,InputStreamReader,BufferedReader) を使うために必要な宣言である.
  public static void main(String[] args) throws IOException{
で,throws IOException をつけるのは,入出力をおこなうと途中でエラーが 起きることがあることを示すものだが,細かい説明は,例外処理を参照してほしい.入力を始める前には,
    BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
と,BufferedReader型のオブジェクト(これは次回やる予定)を作って変数dに 入れる.また,文字列を入れておくための変数を
    String family,given;
のように準備する.文字列を入れるString型の変数宣言はここで初めてかもし れないが,今のところは,intやdoubleなど数を入れるための変数宣言と同じよ うに考えておいて良い.

ここまで準備をして,はじめて

d.readLine()
の結果,キーボードから入力した文字列がStringとして得られるようになる.

ここでは,「キーボードからの入力」としたが,シェル(ターミナルで動くコマンドを扱うプログラム)の リダイレクション機能を使ってファイルやプログラムからの入力をおこなうこともできる.

上の例では,

TANAKA
Tetsuro
という2行のデータの入ったテキストファイルをname.txt という名前で作成しておき,
java YourName < name.txt
のように実行すると,キーボードから何も入力しなくても,
ux103$ java YourName < name.txt
名字を入力してください> 
名前を入力してください> 
あなたの名前はTANAKA Tetsuroです
のように実行できる.

複数行を入力する場合は1行ごとにnew BufferedReaderを実行する(BufferedReader型のオブジェクトを作成す る)必要はなく,一度作ったBufferedReader型のオブジェクト d に対して,

d.readLine();
を繰り返し実行すれば良い.同じストリームに対してnew BufferedReaderを何 度も実行すると,キーボード入力の場合は動くように見えても標準入力をファ イルにリダイレクトすると動かなくなることがある.
この講義で提出されたプログラムをチェックする際には,キーボードから入力す るのではなく,プログラムの実行をチェックするプログラムを使うことがあるが, その場合もこの問題が生じるので,注意されたい.

次に進む