Java Scanner クラス

java.util.Scanner は Java 5 の新機能で、Scanner クラスを通じてユーザーの入力を受け取ることができます。

以下は Scanner オブジェクトを作成する基本的な構文です:

Scanner s = new Scanner(System.in);

次に、最も簡単なデータ入力をデモし、Scanner クラスの next() と nextLine() メソッドで入力された文字列を取得します。読み取り前に、通常は hasNext と hasNextLine を使用して、まだ入力データがあるかどうかを判断する必要があります:

next メソッドを使用:

ScannerDemo.java ファイルコード:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //キーボードからデータを受け取る //next 方式で文字列を受け取る System.out.println("next 方式で受け取り:"); //まだ入力があるかどうかを判断 if (scan.hasNext()) { String str1 = scan.next(); System.out.println("入力されたデータは:" + str1); } scan.close(); } }

上記のプログラムを実行すると、出力結果は次のようになります:

$ javac ScannerDemo.java
$ java ScannerDemo
next方式接收:
サンプル com
输入的数据为:サンプル

com という文字列が出力されていないことがわかります。次に nextLine を見てみましょう。

nextLine メソッドを使用:

ScannerDemo.java ファイルコード:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //キーボードからデータを受け取る //nextLine 方式で文字列を受け取る System.out.println("nextLine 方式で受け取り:"); //まだ入力があるかどうかを判断 if (scan.hasNextLine()) { String str2 = scan.nextLine(); System.out.println("入力されたデータは:" + str2); } scan.close(); } }

上記のプログラムを実行すると、出力結果は次のようになります:

$ javac ScannerDemo.java
$ java ScannerDemo
nextLine方式接收:
サンプル com
输入的数据为:サンプル com

com という文字列が出力されていることがわかります。

next() と nextLine() の違い

next():

  • 1. 有効な文字を読み取った後でなければ入力を終了できません。
  • 2. 有効な文字の前にある空白は、next() メソッドが自動的に除去します。
  • 3. 有効な文字を入力した後に、その後の空白を区切り文字または終了文字として扱います。
  • next() は空白を含む文字列を取得できません。

nextLine():

  • 1. Enter を終了文字とします。つまり、nextLine() メソッドは Enter を入力する前のすべての文字を返します。
  • 2. 空白を取得できます。

int 型や float 型のデータを入力する場合も Scanner クラスでサポートされていますが、入力する前に hasNextXxx() メソッドで検証してから、nextXxx() を使用して読み取るのが最善です:

ScannerDemo.java ファイルコード:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //キーボードからデータを受け取る int i = 0; float f = 0.0f; System.out.print("整数を入力:"); if (scan.hasNextInt()) { //入力が整数かどうかを判断 i = scan.nextInt(); //整数を受け取る System.out.println("整数データ:" + i); } else { //入力エラーの情報 System.out.println("入力は整数ではありません!"); } System.out.print("小数を入力:"); if (scan.hasNextFloat()) { //入力が小数かどうかを判断 f = scan.nextFloat(); //小数を受け取る System.out.println("小数データ:" + f); } else { //入力エラーの情報 System.out.println("入力は小数ではありません!"); } scan.close(); } }

上記のプログラムを実行すると、出力結果は次のようになります:

$ javac ScannerDemo.java
$ java ScannerDemo
输入整数:12
整数数据:12
输入小数:1.2
小数数据:1.2

次の例では、複数の数字を入力し、その合計と平均を求めます。数字を入力するたびに Enter で確定し、数字以外を入力することで入力を終了して実行結果を出力します:

ScannerDemo.java ファイルコード:

import java.util.Scanner; class サンプルTest { public static void main(String[] args) { System.out.println("数字を入力してください:"); Scanner scan = new Scanner(System.in); double sum = 0; int m = 0; while (scan.hasNextDouble()) { double x = scan.nextDouble(); m = m + 1; sum = sum + x; } System.out.println(m + "個の数の合計は" + sum); System.out.println(m + "個の数の平均値は" + (sum / m)); scan.close(); } }

上記のプログラムを実行すると、出力結果は次のようになります(数字以外を入力して入力を終了します):

$ javac ScannerDemo.java
$ java ScannerDemo
请输入数字:
12
23
15
21.4
end
4个数的和为71.4
4个数的平均值是17.85

よく使うメソッド

メソッド 説明
コンストラクタ
Scanner(File source) ファイルから Scanner を作成
Scanner(InputStream source) 入力ストリームから Scanner を作成
Scanner(String source) 文字列から Scanner を作成
基本入力メソッド
boolean hasNext() 次のトークンがあるかどうかを確認(空白区切り)
String next() 次のトークン(文字列)を読み取る
boolean hasNextLine() 次の行があるかどうかを確認
String nextLine() 次の行の内容を読み取る
型チェックメソッド
boolean hasNextInt() 次のトークンが整数かどうかを確認
boolean hasNextDouble() 次のトークンが倍精度浮動小数点数かどうかを確認
boolean hasNextBoolean() 次のトークンがブール値かどうかを確認
型読み取りメソッド
int nextInt() 次の整数を読み取る
double nextDouble() 次の倍精度浮動小数点数を読み取る
boolean nextBoolean() 次のブール値を読み取る
long nextLong() 次の長整数を読み取る
float nextFloat() 次の単精度浮動小数点数を読み取る
short nextShort() 次の短整数を読み取る
byte nextByte() 次のバイトを読み取る
区切り文字の制御
Scanner useDelimiter(String pattern) 区切り文字パターンを設定
Scanner useDelimiter(Pattern pattern) 正規表現を使用して区切り文字を設定
String delimiter() 現在使用している区切り文字パターンを返す
その他のメソッド
void close() スキャナを閉じる
Scanner skip(Pattern pattern) 指定したパターンに一致する入力をスキップ
Scanner skip(String pattern) 指定した文字列に一致する入力をスキップ
String findInLine(Pattern pattern) 現在の行で指定したパターンを検索
String findInLine(String pattern) 現在の行で指定した文字列を検索
Scanner reset() スキャナをリセット
Locale locale() スキャナが現在使用しているロケールを返す
Scanner useLocale(Locale locale) スキャナのロケールを設定

詳細は API ドキュメントを参照してください:https://www.example.com/manual/jdk11api/java.base/java/util/Scanner.html。

その他の拡張