Java
2021.11.25
Javaでキーボード入力された値を取得する方法!【初心者向け】
2023.11.18

1.標準入力とは?

標準入力とは、実行中のプログラムが外部から値を受け取るための標準機能を指します。コマンドラインでの実行時に、キーボードで入力した内容を受け取ることを「標準入力」と呼ぶと覚えましょう。

同様に、コマンドラインへの文字列の出力を「標準出力」と呼びますので、標準入力と標準出力はセットで考えましょう。



2.キーボードから入力する方法


キーボードの入力を受け取る方法は、主に2つあります。

まずは、キーボードで入力した内容を1行取得するプログラムを紹介します。

①Scannerを利用する

ひとつめが、Scannerクラスを使った方法です。

// (1) Scannerクラスのインスタンスを生成
Scanner scanner = new Scanner(System.in);
// (2) キーボードに入力した内容(標準入力)を1行取得
String line = scanner.nextLine();
// (3) 入力した内容を出力
System.out.println(line);

Scannerクラスは、プログラムが値を受け取るために利用するクラスです。

(1)では、コンストラクタの引数に「System.in」を指定することで、キーボードによる標準入力が利用可能になります。

値の取得方法については、後ほど詳しく説明します。

②BufferedReaderを利用する

ふたつめが、BufferedReaderクラスを使った方法です。

// (1) BufferdReaderクラスのインスタンスを生成
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// (2) キーボードに入力した内容(標準入力)を1行取得
String line = br.readLine();
// (3) 入力した内容を出力 
System.out.println(line);

BufferdReaderを利用する場合には、InputStreamReaderも利用してキーボード入力を実現します。

詳しい解説は省略しますが、InputStreamReaderは、標準入力をデータとして受け取るために利用するクラスで、BufferedReaderは、受け取った内容をプログラムで文字として認識するために利用するものと覚えましょう。

 

③ScannerとBufferedReaderの違いは?

ScannerもBufferedReaderもキーボードを用いた標準入力に対応したクラスであり、できることに大きな違いはありません。


動作速度はBufferdReaderの方が速いというメリットがありますが、この差はほとんどありません。
Scannerの方が高機能でありコードの記述もスッキリしますので、Scannerを利用するようにしましょう。


3.入力した値の取得方法


ここからは、Scannerを利用した入力内容の取得方法を紹介します。

①nextメソッドで区切り文字まで取得する

nextメソッドを使うことで、入力した文字のうち、区切り文字の前まで取得します。

Scanner scanner = new Scanner();
String next = scanner.next();
System.out.println(next);

このプログラムを実行し、「This is a pen.」と入力してエンターキーを押すと、「This」が出力されます。

区切り文字とは?

プログラムを実行する際に、複数の値を読み込ませるために利用するのが「区切り文字」です。

空白は区切り文字として認識します。よって、空白を開けて複数の単語を入力することで、複数の値をプログラムに渡すことが可能です。

上記のプログラムでは、はじめのスペースより前の部分をひとつの値として受け取ります。

なお、空白の他にタブや改行も区切り文字として認識されるため注意しましょう。

②nextLineメソッドで行全体を取得する

空白を含むすべての文字を一行で受け取るには、nextLineを利用します。

Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
System.out.println(line);

先ほどと同様に、「This is a pen.」と入力してエンターキーを押すと、「This is a pen.」とすべての文字が出力されます。

③nextIntメソッドで整数に変換する

本来、キーボードに入力された内容はすべて文字列として扱われます。
Scannerは自動で型を変換する機能を有しており、自動で文字列以外への変換が可能です。

Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
System.out.println(number);

実行して数字を入力すると、その数字が表示されます。

整数以外の値に変換するには

Scannerは、整数以外にも自動で変換する機能を有しています。
整数以外へ変換するメソッドを紹介しますので、うまく活用してみてください。

メソッド名変換先
(戻り値)
nextInt()int
nextLong()long
nextDouble()double
nextShort()short
nextBigInteger()BigInteger
nextBigDecimal()BigDecimal



4.【応用編】複数入力された値を順番に受け取る方法

基本的な使い方がわかったところで、応用編として、入力した複数の値を取得する方法を見ていきましょう。

nextメソッドは直近の文字を取得しますが、内部的には入力されたすべての文字列は保持されています。
よってnextをもう一度呼び出すことで、次の入力内容を取得できます。

String first = scanner.next();
String second = scanner.next();

This is a pen. をキーボードから入力した場合、firstにはThisが、secondにはisが代入されます。

このように、入力される個数があらかじめわかっているのであれば、その回数分nextメソッドを実行することですべての入力値を取得できます。

①入力される内容がある限りループする

入力される値の数が変動する場合には、nextメソッドを何回実行して良いのかわかりません。

その場合、次の文字があるかを確認するhasNextメソッドを利用することで、最後まで値を取得し続けることが可能です。

// 入力結果を格納するリスト
List<String> inputStrings = new ArrayList<>();

while(scanner.hasNext()) {
  String capture = scanner.next();
  inputStrings.add(capture);
}
// 結果を表示
System.out.println(inputStrings);

上記のコードを実行し、「This is a pen.」を入力してみましょう。
実は、これだけではキーボードの入力待ちのままで止まってしまい、最後の表示まで辿り着きません。


そのため、終了条件を付与する必要があります。
例として、入力内容が「.(ドット)」で終わっていたら終了となるようにプログラムを改造しましょう。

// 入力結果を格納するリスト
List<String> inputStrings = new ArrayList<>();

while(scanner.hasNext()) {
  String capture = scanner.next();
  inputStrings.add(capture);
  // 最後が.で終わる場合には終了する。
  if (capture.endsWith(".")) {
    break;
  }
}
// 結果を表示
System.out.println(inputStrings);

このコードで再実行し「This is a pen.」と入力することで、次の結果が出力されます。

[This, is, a, pen.]



5.キーボード入力された値を扱う際の注意点


ここでは、キーボード入力した値を取り扱う場合に注意するべきポイントを解説していきます。

①正しい値が入力されない場合がある

プログラム上、整数を入力してもらう前提でコードを書いたとします。しかし、ユーザーは小数点を入れる可能性もありますし、数値以外の文字を入力する可能性もあります。


その場合、プログラムが予期せぬ動きをする場合もあるので注意が必要です。ユーザーが値を入力するようなプログラムを作る際には、入力される内容を考慮するようにしましょう。

たとえば、名前と年齢を入力してもらうプログラムを考えます。

Scanner scanner = new Scanner(System.in);

// 入力を促すメッセージ
System.out.println("氏名と年齢を入力してください。");
// 氏名の取得
String name = scanner.next();
// 年齢の取得
int age = scanner.nextInt();

System.out.println(name+"さんは"+age+"歳です。");

このとき、次のように入力するとどうなるのでしょうか。

佐藤太郎 abc

氏名は正しく取得できますが、年齢の取得でエラーになってしまいます。

入力チェックを行う

入力してもらう文字に制限をしたい場合には、都度入力された内容をチェックしましょう。

nextIntであれば、それに対応する型をチェックするhasNextInt()が使えます。

Scanner scanner = new Scanner(System.in);
// 入力を促すメッセージ
System.out.println("氏名と年齢を入力してください。");

// 氏名の取得
String name = scanner.next();

// 年齢の取得(数値以外が入力され続ける限りループ)
while (!scanner.hasNextInt()) {
  // 整数でなければ再度入力を促す
  System.out.println("年齢には整数値を入れてください");
  // 入力された内容を破棄する
  scanner.next();
}
int age = scanner.nextInt();
System.out.println(name+"さんは"+age+"歳です。");

このように、入力された内容を逐次チェックすることで、予期しない動作を防止することが可能です。

②入力した値が文字化けする

「こんにちは」と入力したはずが、実行すると「縺薙s縺ォ縺。縺ッ」という文字が出力されてしまうことがあります。このように、想定しない文字が出力される現象を「文字化け」と呼びます。


プログラムの世界には「文字コード」という概念が存在し、同じ文字であっても、OSによってそれを表現する値(コード)が異なるのです。この文字コードが一致しないと、想定しない文字列が表示されます。


例えば、Windowsは「MS932」という文字コードを、LinuxやMacは「UTF-8」という文字コードを採用しています。そのため、Windowsで開発したJavaプログラムをMacで動かした場合に、この「文字化け」が発生する場合があるのです。

文字コードを確認する

この文字化けを防止するためには、Javaのソースコードの文字コードを確認しましょう。

Eclipseであれば、右クリックメニューの「プロパティ」からファイルの文字コードを確認できます。

文字コードが「Windows-31J」や「MS932」になっていた場合には、「UTF-8」に変更して再実行しましょう。


この記事をシェア