MEDIA

メディア

  1. TOP
  2. メディア
  3. プログラミング
  4. Java Scanner完全ガイド|標準入力・ファイル読込・落とし穴まで徹底解説

Java Scanner完全ガイド|標準入力・ファイル読込・落とし穴まで徹底解説

Java Scannerとは?入力処理の基本概念

Scannerが「初心者向け」と言われる理由

Javaで入力処理を学ぶとき、最初に登場するのがjava.util.Scannerです。

Scannerは、標準入力(キーボード)とファイル入力を同じ感覚で扱えるため、初学者でも理解しやすい設計になっています。

  • 型変換を自動で行ってくれる
  • メソッド名が直感的
  • 1行ずつ/単語ずつを簡単に扱える

こういった特徴から、学習用・小規模ツールでは特に重宝されます。

トークン分割という考え方

Scannerの核心は「入力を区切り文字で分割する」点にあります。

  • 入力は「トークン」という単位に分解される
  • デフォルトの区切り文字は空白・改行
  • next()系メソッドは次のトークンを取得する

この仕組みを理解すると、

「なぜ空文字が取れるのか」「なぜ例外が出るのか」が説明できるようになります。

Scannerを使う準備と基本の書き方

importとインスタンス生成

Scannerはjava.utilパッケージに含まれます。

import java.util.Scanner;

標準入力の場合は以下のように生成します。

Scanner sc = new Scanner(System.in);

Scannerは入力元を包むラッパーです。

どこから入力を受け取るかをコンストラクタで指定します。

※インスタンスとは?についてはこちら

Scannerを1つにまとめる設計の重要性

実務でよくある失敗が、同じ入力元に複数Scannerを作ることです。

  • 入力順が分からなくなる
  • 読み取り位置がズレる
  • デバッグが困難になる

Scannerは基本的に「1入力元=1Scanner」を守ると、トラブルが激減します。

標準入力(キーボード入力)の基本

next / nextLine の違い

Scannerで最も重要なのがこの2つです。

メソッド 読み取る範囲
next() 次のトークン(空白まで)
nextLine() 行全体(改行まで)

空白を含む入力を扱うなら、nextLine()が基本です。

入力待ちの仕組みとUI設計

Scannerの読み取りは、ユーザーがEnterを押すまで待機します。

止まって見えるときは、入力待ちである可能性が高いです。

System.out.print("名前を入力してください");
String name = sc.nextLine();

このようにプロンプトを表示すると、操作ミスが減ります。

数値・真偽値の読み取りと安全な入力チェック

nextInt / nextDouble の注意点

int age = sc.nextInt();

便利ですが、文字が入力されると即例外になります。

安全に書くなら、必ず事前チェックを行います。

if (sc.hasNextInt()) {
 int age = sc.nextInt();
} else {
 System.out.println("整数を入力してください");
 sc.next(); //不正トークンを捨てる
}

hasNext系メソッドで壊れない入力処理

Scannerには以下の判定メソッドがあります。

  • hasNextInt()
  • hasNextDouble()
  • hasNextLine()

例外に頼らず制御できるため、対話式プログラムでは必須です。

例外処理と入力エラー対策

InputMismatchExceptionの正体

nextInt()で文字が入力されると、

  • InputMismatchExceptionが発生
  • 不正トークンは消費されない

つまり、同じ例外が永遠に出続ける状態になります。

無限ループを防ぐ設計

必ず以下のどちらかを行います。

  • next()で不正トークンを捨てる
  • nextLine()で行ごと捨てる

入力エラー時の回復設計が、プログラムの安定性を決めます。

※例外処理についてはこちらの記事もご参考ください

Scannerのリソース管理とcloseの考え方

close()が必要な理由

Scannerは内部でリソースを保持します。

  • ファイルハンドル
  • ストリーム

閉じ忘れると、リソース枯渇の原因になります。

try-with-resourcesの実践

try (Scanner sc = new Scanner(new File("data.txt"))) {
 while (sc.hasNextLine()) {
  System.out.println(sc.nextLine());
 }
}

例外が起きても自動でcloseされるため、安全です。

よくある落とし穴:nextIntの後にnextLineが空になる

原因(改行の読み残し)

  • nextInt()は数値のみ消費
  • 改行は残る
  • 次のnextLine()が空文字を読む

正しい解決方法

方法①:ダミーで改行を消費

int age = sc.nextInt();
sc.nextLine(); //改行を捨てる
String name = sc.nextLine();

方法②:nextLineに統一(推奨)

int age = Integer.parseInt(sc.nextLine());

ファイル読み込みにScannerを使う

ファイル入力の基本コード

try (Scanner sc = new Scanner(new File("users.txt"))) {
 while (sc.hasNextLine()) {
  String line = sc.nextLine();
  System.out.println(line);
 }
}

CSVや区切り文字の扱い方

sc.useDelimiter(",");

ただし、厳密なCSV処理には不向きです。

実務では専用ライブラリも検討します。

実務で使えるScanner実践コード例

標準入力の実践例

Scanner sc = new Scanner(System.in);
int age;
 while (true) {
  System.out.print("年齢を入力してください: ");
  if (sc.hasNextInt()) {
   age = sc.nextInt();
   sc.nextLine();
   break;
  }
  sc.next();
 }

System.out.print("名前を入力してください: ");
String name = sc.nextLine();

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

ファイル入力の実践例

try (Scanner sc = new Scanner(new File("users.csv"))){
 while (sc.hasNextLine()){
  String[] data = sc.nextLine().split(",");
  System.out.println(data[0] + ":" + data[1]);
 }
}

Java Scannerまとめと次の学習ステップ

Scannerは、

  • 標準入力とファイル入力を同一APIで扱える
  • トークンと行の違いを理解すると安定する
  • hasNext系と例外設計が重要

という特徴を持つ、Java学習の最重要クラスの1つです。

基礎構文を理解したら、

「実際に手を動かして書く経験」が成長を加速させます。

ここまで読んで、
「Scannerの仕組みは理解できたけど、実際にコードを書く環境を用意するのが少し面倒…」
と感じた方もいるかもしれません。

そんな方に向いているのが、
ブラウザ上ですぐにJavaを動かせる学習コンテンツ
「ZeroCodePlus」です。

ZeroCodePlusは、Progateのように
環境構築なし・インストール不要で、
画面の指示に従ってコードを書きながら学習を進められるのが特徴です。

エディタの準備や設定につまずくことなく、
「まず書いてみる」「動かして確かめる」
という学習サイクルを、ゲーム感覚で始められます。

Scannerの入力処理のように、
実際に動かさないと理解しづらい内容ほど、
こうしたブラウザ完結型の学習環境は相性が良いでしょう。

▶ ZeroCodePlusでJavaをブラウザ学習してみる

環境構築なしでブラウザ上からJavaを試せる

ZeroCodePlusのような学習環境を使うと、

理解 → 実践 → 定着のサイクルを素早く回せます。

Join us! 未経験からエンジニアに挑戦できる環境で自分の可能性を信じてみよう 採用ページを見る→

記事監修

ドライブライン編集部

[ この記事をシェアする ]

記事一覧へ戻る