ファイルからの入力を行うスキャナを作成する

Scanner クラスの利用方法として作成済みのファイルから値を受け取りプログラムの中で利用する方法について解説します。

(Last modified: )

ファイルからの入力を行うScannerクラスのインスタンスを作成する

ここまでは標準入力から値を受けとるスキャナを利用してきましたが、スキャナの入力ストリームとしてファイルを指定することができます。既に作成済みのファイルを指定すると、ファイルの内容を読み込んで取得します。ファイルからの入力を行う Scanner クラスのインスタンスを作成するには次のコンストラクタを使用します。

public Scanner(File source) throws FileNotFoundException

パラメータ:
source - スキャン対象のファイル

例外:
FileNotFoundException - ソースが見つからない場合

1 番目の引数に既存のファイルを表す File クラスのインスタンスを指定します。

ファイルから読み取った値は、基になるプラットフォームのデフォルト文字セットを使用して文字に変換されます。例えば Windows 環境であれば Shift_JIS で記述されたものとして扱われます。

次のサンプルを見てください。

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

class JSample4_1{
  public static void main(String[] args){
    try{
      File file = new File("sample.txt");
      Scanner scanner = new Scanner(file);

      while (scanner.hasNext()){
        String dat = scanner.next();
        System.out.println(dat);
      }
    }catch(FileNotFoundException e){
      System.out.println(e);
    }
  }
}

プログラムと同じディレクトリに次のような値が記述された sample.txt ファイルを作成して設置しています。

リンゴ オレンジ レモン

プログラムを実行すると、ファイルから区切り文字までの値を取得し、画面に表示します。これを値を取得できなくなるまで繰り返します。

ファイルからの入力を行うScannerクラスのインスタンスを作成する(1)

作成した sample.txt ファイルの文字セットは Shift_JIS にしてあります。 Windows 環境の場合のデフォルトの文字セットは Shift_JIS なので問題なくファイルの値を読み込むことができます。

sample.txt ファイルの文字セットが UTF-8 などのように環境毎に決められているデフォルトの文字セットと異なる場合、次のように文字化けが起こります。

ファイルからの入力を行うScannerクラスのインスタンスを作成する(2)

環境毎のデフォルトの文字セットとは異なる文字セットで保存されたファイルを読み込みたい場合や、明示的に文字セットを指定したい場合はこのあとで解説するコンストラクタを使用してください。

ファイルからデータを読み込むときの文字セットを指定する

例えば Windows 環境で文字セットとして UTF-8 を使用して保存されたファイルからスキャナを作成したい場合など、使用する文字セットを指定する場合には次のコンストラクタを使用します。

public Scanner(File source, String charsetName) throws FileNotFoundException

パラメータ:
source - スキャン対象のファイル
charsetName - ファイルから取得したバイトをスキャン対象の文字に変換する際に使用するエンコーディング型

例外:
FileNotFoundException - ソースが見つからない場合
IllegalArgumentException - 指定されたエンコーディングが見つからない場合

1 番目の引数に既存のファイルを表す File クラスのインスタンスを指定し、 2 番目の引数に使用する文字セットを表す文字列を指定します。

次のサンプルを見てください。

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

class JSample4_2{
  public static void main(String[] args){
    try{
      File file = new File("sample.txt");
      Scanner scanner = new Scanner(file, "UTF-8");

      while (scanner.hasNext()){
        String dat = scanner.next();
        System.out.println(dat);
      }
    }catch(FileNotFoundException e){
      System.out.println(e);
    }
  }
}

プログラムと同じディレクトリに次のような値が記述された sample.txt ファイルを作成して設置しています。

リンゴ オレンジ レモン

プログラムを実行すると、ファイルから区切り文字までの値を取得し、画面に表示します。これを値を取得できなくなるまで繰り返します。

ファイルからデータを読み込むときの文字セットを指定する(1)

今回 sample.txt ファイルは文字セットとして UTF-8 を使って保存しています。作成したスキャナは 2 番目の引数で使用する文字セットとして UTF-8 を指定しているので、文字化けすることなくファイルの値を取得することができました。

ファイルから行単位で値を取得する

スキャナから値を読み込む場合で区切り文字までの値を順に取得する代わりに行単位で値を取得する場合も試しておきます。行単位で値を取得する場合は next メソッドの代わりに nextLine メソッドを使用します。 nextLine メソッドの詳細な使い方は「区切り文字を無視して次の行までの値を受け取る」を参照されてください。

次のサンプルを見てください。

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

class JSample4_3{
  public static void main(String[] args){
    try{
      File file = new File("sample2.txt");
      Scanner scanner = new Scanner(file, "UTF-8");

      while (scanner.hasNextLine()){
        String dat = scanner.nextLine();
        System.out.println(dat);
      }
    }catch(FileNotFoundException e){
      System.out.println(e);
    }
  }
}

プログラムと同じディレクトリに次のような値が記述された sample2.txt ファイルを作成して設置しています。文字セットとして UTF-8 を使用しています。

Hello.
It's nice weather today, is not it.
Goodbye. See you again.

プログラムを実行すると、区切り文字までではなく行単位で値を取得し画面に表示しました。

ファイルから行単位で値を取得する(1)

-- --

Scanner クラスの利用方法として作成済みのファイルから値を受け取りプログラムの中で利用する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。