見出し画像

コマンドライン入力(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クラスを使って文字列に変換してから入力を取得します。

いいなと思ったら応援しよう!