コマンドライン入力(Java)
標準入力とは?
標準入力は、コンピュータの入力装置による入力を指します。
多くの場合はキーボードによる文字入力を標準入力としています。
Javaでは『Systemクラスのinフィールド』で標準入力を取得します。
但し、System.inのInputStream型はバイトストリームでの読み込みを行うメソッドしか用意されていません。
そのため、ScannerクラスやInputStreamReaderクラスなどを駆使して、バイナリストリームで読み込んだバイナリデータを文字列や数値に変換して読み込みが必要となります。
今回は入力データを文字列として読み込むことをゴールとします。
InputStreamクラス
java.ioパッケージに実装されています。
入力のバイナリストリームを表現する全てのクラスのスーパークラスです。
System.inフィールドが文字列に変換されずに、バイナリとして取り扱われるかを試しに確認してみましょう。
import java.io.IOException;
public class sample {
public static void main(String[] args) {
try {
System.out.println(System.in.read());
} catch (IOException e) {
System.out.println(e);
}
}
}
コマンドラインで「a」と入力した場合、下記が表示されます。
$ 97
実行環境がWindowsのため、SJISの文字コードが表示されました。
このようにSystem.in.readメソッドを使用すれば
簡単にコマンドラインから入力を読み込むことが可能ですが、バイナリで1文字ずつしか読み込むことができないため、実際の現場でこの単体で使用されることは滅多にありません。
Scannerクラス
java.utilパッケージに実装されており、コマンドラインに入力された1行を文字列として取得されます。
nextLineメソッド
最も使用頻度が多いメソッドはnextLineメソッドです。
これは1行分の入力を文字列として取得します。
import java.util.Scanner;
public class sample {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
System.out.println(str);
scan.close();
}
}
コマンドラインで「ABCDE」と入力した場合、下記のように出力されます。
$ ABCDE
nextメソッド
nextメソッドは空白文字までの入力を取得します。
複数の入力値がある場合などには便利です。
import java.util.Scanner;
public class sample {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str1 = scan.next();
String str2 = scan.next();
System.out.println(str1);
System.out.println(str2);
scan.close();
}
}
コマンドラインで「ABCDE 12FG」と入力した場合、下記のように出力されます。
$ ABCDE
$ 12FG
nextIntメソッド
今までのメソッドは数を数字として読み込みますが、
nextIntメソッドは数値として値を取得し、浮動小数点数型を読み込むnextDoubleメソッドやnextFloatメソッドもあります。
import java.util.Scanner;
public class sample {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int str1 = scan.nextInt();
int str2 = scan.nextInt();
System.out.println(str1);
System.out.println(str2);
scan.close();
}
}
コマンドラインで「123 0.123」と入力した場合、下記のように出力されます。
$ 123
$ 0.123
ちなみに、nextIntメソッドで浮動小数点型を取得しようとした場合は、下記のエラーが発生します。
0.123
Exception in thread "main" java.util.InputMismatchException
InputMismatchExceptionは、コマンドラインで取得されたトークンが期待されるタイプのパターンと一致しないと発生します。
まとめ
Javaでは、バイナリとして読み込みたい場合はSystem.in.readメソッドを使用し、複数文字を繰り返し読みたい場合は「-1」が返却されるまで読み込み続ければよいです。
但し、文字列や整数として入力値を取得したい場合は、ScannerクラスやInputStreamReaderクラスを使って文字列に変換してから入力を取得します。