モジュール java.base
パッケージ java.util

クラスScanner

java.lang.Object
java.util.Scanner
すべての実装されたインタフェース:
Closeable, AutoCloseable, Iterator<String>

public final class Scanner extends Object implements Iterator<String>, Closeable
正規表現を使用してプリミティブ型および文字列の構文解析が可能な、単純なテキスト・スキャナです。

Scannerは、区切り文字のパターンを使用して入力をトークンに分割します。デフォルトでは区切り文字は空白文字です。 結果のトークンは、様々なnextメソッドを使用して様々なタイプの値に変換できます。

たとえば、このコードを使用すると、ユーザーはコンソールから番号を読み取ることができます。

    var con = System.console();
    if (con != null) {
        Scanner sc = new Scanner(con.reader());
        int i = sc.nextInt();
    }

別の例として、次のコードを使用して、myNumbersファイル内のエントリからlong型を割り当てることができます。

     Scanner sc = new Scanner(new File("myNumbers"));
     while (sc.hasNextLong()) {
         long aLong = sc.nextLong();
     }

スキャナは、空白文字以外の区切り文字も使用できます。 次の例では、文字列から複数の項目を読み取ります。

    String input = "1 fish 2 fish red fish blue fish";
    Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
    System.out.println(s.nextInt());
    System.out.println(s.nextInt());
    System.out.println(s.next());
    System.out.println(s.next());
    s.close();

画面には次のように表示されます。


     1
     2
     red
     blue
 

次のコードでも、同じ出力を生成できます。このコードでは、4つのトークンを一度に構文解析する正規表現を使用します。

    String input = "1 fish 2 fish red fish blue fish";
    Scanner s = new Scanner(input);
    s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
    MatchResult result = s.match();
    for (int i=1; i<=result.groupCount(); i++)
        System.out.println(result.group(i));
    s.close();

スキャナで使用される「デフォルトの空白区切り文字」は、Character.isWhitespace()によって認識されます。 reset()メソッドは、スキャナの区切り文字が以前に変更されたかどうかにかかわらず、その値をデフォルトの空白区切り文字にリセットします。

スキャン操作により、入力の待機が妨げられる場合があります。

next()およびhasNext()メソッドとそのコンパニオン・メソッド(nextInt()hasNextInt()など)は、最初にデリミタ・パターンと一致する入力をスキップしてから、次のトークンを返そうとします。 hasNext()メソッドとnext()メソッドの両方が、追加入力の待機をブロックする場合があります。 hasNext()メソッド・ブロックに、関連付けられているnext()メソッドがブロックするかどうかとの接続がないかどうか。 tokens()メソッドは、入力の待機をブロックすることもできます。

findInLine()findWithinHorizon()skip()およびfindAll()メソッドは、デリミタ・パターンとは独立して動作します。 これらのメソッドは、入力内の区切り文字とは無関係に指定されたパターンのマッチングを試みます。このため、区切り文字と無関係な特殊な環境で使用できます。 これらのメソッドは、それ以上の入力の待機をブロックできます。

スキャナがInputMismatchExceptionをスローするとき、ほかのメソッドを使用して取得またはスキップできるように、スキャナは例外の原因となったトークンを渡しません。

区切り文字パターンのタイプに応じて、空のトークンが返されることがあります。 たとえば、パターン"\\s+"はデリミタの複数のインスタンスと一致するため、空のトークンを返しません。 区切りパターン"\\s"は、一度に1つのスペースしか渡さないため、空のトークンを返すことができます。

スキャナは、Readableインタフェースを実装する任意のオブジェクトからテキストを読み取ることができます。 基礎となる読取り可能オブジェクトのread()メソッドの呼出しでIOExceptionがスローされると、スキャナは入力の終わりに達したと想定します。 基礎となる読取り可能オブジェクトによってスローされた最新のIOExceptionは、ioException()メソッドを介して取得できます。

Scannerが閉じられる場合、その入力ソースがCloseableインタフェースを実装していると、そのソースも閉じられます。

Scannerが、外部の同期化を行わずにマルチ・スレッドを使用するのは安全ではありません。

特に明記されていないかぎり、nullパラメータをScannerのいずれかのメソッドに渡すと、NullPointerExceptionがスローされます。

useRadix(int)メソッドを使用して別の基数が設定されていない場合、スキャナは数値を10進数として解釈します。 reset()メソッドは、スキャナの基数の値を、以前に変更されたかどうかにかかわらず、10にリセットします。

ローカライズの数

このクラスのインスタンスは、標準の書式に加え、スキャナのロケールの書式で数値をスキャンできます。 スキャナの「初期ロケール」は、Locale.getDefault(Locale.Category.FORMAT)メソッドによって戻される値です。これは、useLocale()メソッドを介して変更できます。 reset()メソッドは、以前に変更されたかどうかにかかわらず、スキャナのロケールの値を初期ロケールにリセットします。

ローカライズされた形式は、次のパラメータで定義されます。特定のロケールについては、そのロケールのDecimalFormatオブジェクト、df、およびDecimalFormatSymbolsオブジェクトdfsから取得されます。

LocalGroupSeparator  
千のグループを区切るために使用する文字、つまり、dfs.getGroupingSeparator()
LocalDecimalSeparator  
小数点に使用する文字、つまり、dfs.getDecimalSeparator()
LocalPositivePrefix  
正の数値の前に出現する文字列(空の場合があります)、つまり、df.getPositivePrefix()
LocalPositiveSuffix  
正の数値の後に表示される文字列(空の場合があります)、つまり、df.getPositiveSuffix()
LocalNegativePrefix  
負の数値の前に出現する文字列(空の場合があります)、つまり、df.getNegativePrefix()
LocalNegativeSuffix  
負の数値の後に表示される文字列(空の場合があります)、つまり、df.getNegativeSuffix()
LocalNaN  
浮動小数点値の非数値を表す文字列、つまり、dfs.getNaN()
LocalInfinity  
浮動小数点値の無限を表す文字列、つまり、dfs.getInfinity()

数値の構文

このクラスのインスタンスが数値として構文解析可能な文字列は、次の正規表現の文法に従って指定されます。ここで、Rmaxは、使用中の基数の中で最大の数字です(たとえば、基数10のRmaxは9)。

NonAsciiDigit:
Character.isDigit(c)がtrueを返すASCII以外の文字c
Non0Digit:
[1-Rmax] | NonASCIIDigit
Digit:
[0-Rmax] | NonASCIIDigit
GroupedNumeral:
Non0Digit Digit? Digit?
    LocalGroupSeparator Digit Digit Digit )+ )
Numeral:
( ( Digit+ ) | GroupedNumeral )
Integer:
( [-+]? ( 「数字」 ) )
| LocalPositivePrefix 「数字」 LocalPositiveSuffix
| LocalNegativePrefix 「数字」 LocalNegativeSuffix
DecimalNumeral:
Numeral
| Numeral LocalDecimalSeparator Digit*
| LocalDecimalSeparator Digit+
Exponent:
( [eE] [+-]? Digit+ )
Decimal:
( [-+]? DecimalNumeral Exponent? )
| LocalPositivePrefix DecimalNumeral LocalPositiveSuffix Exponent?
| LocalNegativePrefix DecimalNumeral LocalNegativeSuffix Exponent?
HexFloat:
[-+]? 0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+ ([pP][-+]?[0-9]+)?
NonNumber:
NaN | LocalNan | Infinity | LocalInfinity
SignedNonNumber:
( [-+]? NonNumber )
| LocalPositivePrefix NonNumber LocalPositiveSuffix
| LocalNegativePrefix NonNumber LocalNegativeSuffix
Float:
Decimal | HexFloat | SignedNonNumber

前述の正規表現では、空白文字は無視されます。

導入されたバージョン:
1.5