Scannerクラスを新人エンジニアに解説

こんにちは。ゆうせいです。

今日は、Javaの「Scannerクラス」について解説していきます。

このクラスはJavaプログラミングでの「入力」を処理する際に非常に役立つツールです。プログラミング初心者でも理解しやすいよう、丁寧に説明しますね!


Scannerクラスとは?

Scannerクラスは、ユーザーからの入力を簡単に取得できるようにするためのJava標準ライブラリの一部です。このクラスを使うと、コンソールやファイルからデータを取得しやすくなります。

例えるなら…

Scannerクラスは、「データを読むためのスキャナー」と考えてみてください。紙に書かれた情報(入力)をスキャナーで読み取って、コンピューターに取り込むようなイメージです。


Scannerクラスを使う準備

Scannerクラスを使うには、以下の手順を踏みます。

1. インポート

Scannerクラスはjava.utilパッケージに属しています。使用する前に、以下のようにインポートする必要があります。

import java.util.Scanner;

2. インスタンス化

Scannerクラスを利用するには、インスタンス(オブジェクト)を作成します。
例えば、コンソール(キーボード入力)から読み込む場合:

Scanner scanner = new Scanner(System.in);

ここで使われているSystem.inは、コンソールからの入力を指します。


基本的な使い方

Scannerクラスはさまざまなデータ型の入力をサポートしています。それぞれの方法を見ていきましょう。

1. 文字列の入力

ユーザーが入力した1行を取得する場合は、nextLine()メソッドを使います。

System.out.print("名前を入力してください: ");
String name = scanner.nextLine();
System.out.println("こんにちは、" + name + "さん!");

2. 整数の入力

整数を取得したい場合は、nextInt()を使用します。

System.out.print("年齢を入力してください: ");
int age = scanner.nextInt();
System.out.println("あなたの年齢は " + age + " 歳ですね!");

3. 小数の入力

小数を取得するには、nextDouble()メソッドを使います。

System.out.print("身長を入力してください (m): ");
double height = scanner.nextDouble();
System.out.println("あなたの身長は " + height + " メートルですね!");


Scannerクラスの注意点

便利なScannerクラスですが、いくつか気をつけるべきポイントもあります。

1. nextLine()と他のメソッドの組み合わせ問題

例えば、nextInt()の後にnextLine()を呼び出すと、思ったように動かないことがあります。これは、nextInt()が改行文字(\n)を処理せずに残してしまうためです。

解決方法

nextLine()を使って改行を消化するコードを挟むと問題が解消します。

System.out.print("年齢を入力してください: ");
int age = scanner.nextInt();
scanner.nextLine();  // 改行を消化
System.out.print("名前を入力してください: ");
String name = scanner.nextLine();
System.out.println(name + "さん、" + age + "歳ですね!");

2. リソースの解放

Scannerオブジェクトを使い終わったら、close()メソッドを呼び出してリソースを解放しましょう。

scanner.close();



ファイル読み込みの基本手順

1. 必要なインポート

ファイル操作にはjava.io.Fileクラスを使用するため、以下をインポートします。

import java.io.File;
import java.util.Scanner;


2. ファイルの準備

読み込み対象のファイルを用意します。例えば、data.txtという名前のファイルがあるとします。

data.txtの例:

Alice,25
Bob,30
Charlie,22


3. ファイルを読み込むコード

以下のコードでファイルの内容を読み取ることができます。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileReadingExample {
    public static void main(String[] args) {
        try {
            // 読み込み対象のファイルを指定
            File file = new File("data.txt");
            Scanner scanner = new Scanner(file);

            // ファイルの内容を1行ずつ読み込む
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine(); // 1行を取得
                System.out.println(line);        // 取得した行を表示
            }

            // Scannerを閉じる(リソースの解放)
            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("ファイルが見つかりません: " + e.getMessage());
        }
    }
}


コードのポイント

1. Fileクラス

Fileクラスは、ファイルやディレクトリを表します。コンストラクタにファイルパスを渡して作成します。

File file = new File("data.txt");

2. Scannerクラス

Scannerクラスを使ってファイルを読み取ります。System.inの代わりにFileオブジェクトを渡します。

Scanner scanner = new Scanner(file);

3. ファイルの内容を1行ずつ読み込む

hasNextLine()で次の行が存在するかを確認し、nextLine()でその行を取得します。

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    System.out.println(line);
}

4. 例外処理

ファイルが存在しない場合やアクセス権がない場合に備えて、例外処理を追加します。FileNotFoundExceptionをキャッチします。

catch (FileNotFoundException e) {
    System.out.println("ファイルが見つかりません: " + e.getMessage());
}


応用例

1. カンマ区切りデータの処理

データをカンマ(,)で分割して処理する方法です。

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    String[] parts = line.split(","); // カンマで分割
    String name = parts[0];           // 名前
    int age = Integer.parseInt(parts[1]); // 年齢
    System.out.println("名前: " + name + ", 年齢: " + age);
}


2. ファイル内の単語をカウント

ファイル全体の単語数を数えるプログラムです。

int wordCount = 0;

while (scanner.hasNext()) {
    scanner.next(); // 次の単語を取得
    wordCount++;
}

System.out.println("単語数: " + wordCount);


3. 数値の合計を計算

ファイル内の数値を合計する方法です。ファイルには1行に1つの数値が書かれていると仮定します。

int sum = 0;

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    sum += Integer.parseInt(line); // 数値に変換して加算
}

System.out.println("合計: " + sum);


注意点

  1. ファイルのパス ファイルパスが間違っているとFileNotFoundExceptionがスローされます。正しい相対パスや絶対パスを指定しましょう。
  2. リソースの解放 Scannerオブジェクトを使用後は必ずclose()メソッドを呼び出してリソースを解放してください。try-with-resourcesを使うと自動的に解放されます。
try (Scanner scanner = new Scanner(new File("data.txt"))) {
    while (scanner.hasNextLine()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    System.out.println("ファイルが見つかりません: " + e.getMessage());
}

  1. 文字エンコーディング ファイルが特定の文字エンコーディング(例: UTF-8)で保存されている場合、Scannerのコンストラクタで指定する必要があります。
Scanner scanner = new Scanner(new File("data.txt"), "UTF-8");


練習問題

問題:テキストファイル内の名前をアルファベット順に並べ替える

  1. ファイルnames.txtには以下のような名前が書かれています: Charlie Alice Bob
  2. このファイルを読み込み、名前をアルファベット順に並べ替えて表示するプログラムを書いてください。

ヒント

  • List<String>に名前を格納する。
  • Collections.sort()でリストをソートする。

使えるメソッド一覧

以下に、Scannerクラスでよく使われるメソッドをまとめます。

メソッド名説明
nextLine()1行分の文字列を読み込む
next()スペースで区切られた単語を読み込む
nextInt()整数を読み込む
nextDouble()小数を読み込む
hasNext()次のトークンがあるか確認する
hasNextInt()次のトークンが整数か確認する

練習問題

最後に、簡単なプログラムを作ってみましょう!

問題:簡単な計算機を作る ユーザーに2つの数値を入力させ、それらを足し算するプログラムを書いてみてください。

ヒント

  • nextInt()を使って数値を読み込む。
  • 結果をSystem.out.printlnで出力する。

まとめと次のステップ

Scannerクラスは、ユーザー入力を処理するための強力なツールです。ただし、入力形式やエラー処理に気をつける必要があります。今後は以下を学ぶと理解が深まります。

  1. 例外処理:予期しない入力への対応。
  2. ファイル入力:Scannerを使ってファイルの内容を読み取る方法。
  3. 正規表現:入力をもっと柔軟に処理するテクニック。

ぜひ自分の手でコードを書いて、実際に動かしてみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。