1概要

このチュートリアルでは、ファイルを

ArrayList

** に読み込むさまざまな方法について説明します。


Javaでファイルを読み取る

には多くの方法があります。ファイルを読み込むと、そのファイルの内容に対して多くの操作を実行できます。

ソートなど、これらの操作の中には、ファイルの内容全体をメモリに処理する必要があるものもあります。そのような操作を実行するために、ファイルを行または単語の

Array

または

List

として読み込む必要があるかもしれません。

2.

FileReader

を使う

Javaでファイルを読むための最も基本的な方法は

FileReader

を使うことです。定義上、**

FileReader

は__Fileから文字のストリームを読み取るための便利なクラスです。

__FileReaderを初期化するために使用できるコンストラクタは複数あります。

FileReader f = new FileReader(String filepath);
FileReader f = new FileReader(File f);
FileReader f = new FileReader(FileDescriptor fd);

これらのコンストラクタはすべて、デフォルトの文字エンコーディングとデフォルトのバイトバッファサイズが適切であると見なします。

ただし、カスタム文字エンコーディングとバイトバッファサイズを提供したい場合は、

InputStreamReader

または

FileInputStream

を使用できます。

次のコードでは、

FileReaderを使用して、ファイルから

ArrayListに__行を読み込む方法を示します。

ArrayList<String> result = new ArrayList<>();

try (FileReader f = new FileReader(filename)) {
    StringBuffer sb = new StringBuffer();
    while (f.ready()) {
        char c = (char) f.read();
        if (c == '\n') {
            result.add(sb.toString());
            sb = new StringBuffer();
        } else {
            sb.append(c);
        }
    }
    if (sb.length() > 0) {
        result.add(sb.toString());
    }
}
return result;

3.

BufferedReader

を使う


FileReader

は非常に使いやすいですが、ファイルを読み込むときは常に

BuffereReader

でラップすることをお勧めします。

これは、



BufferedReader

が文字入力ストリームから複数の値を同時に読み取るためにcharバッファーを使用しているため、基礎となる

FileStream

によって行われる__read()呼び出しの数が減るためです。


BufferedReader

のコンストラクタは、入力として

Reader

を取ります。さらに、コンストラクタでバッファサイズを指定することもできますが、ほとんどの使用例では、デフォルトサイズは十分に大きいです。

BufferedReader br = new BufferedReader(new FileReader(filename));
BufferedReader br = new BufferedReader(new FileReader(filename), size);


Reader

クラスから継承されたメソッドに加えて、

__BufferedReaderは

readLine()

メソッドも提供し、行全体を

Stringとして読み取ります。

ArrayList<String> result = new ArrayList<>();

try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
    while (br.ready()) {
        result.add(br.readLine());
    }
}

4.

Scanner

を使う

ファイルを読み込む別の一般的な方法は

Scanner

を使うことです。


  • Scanner

    は、正規表現を使用してプリミティブ型と文字列を解析するために使用される単純なテキストスキャナです。

ファイルを読み込むとき、

Scanner



File

または

FileReader

オブジェクトを使用して初期化されます。

Scanner s = new Scanner(new File(filename));
Scanner s = new Scanner(new FileReader(filename));


BufferedReaderと同様に、Scanner

は行全体を読み取るための

readLine()

メソッドを提供します。

ArrayList<String> result = new ArrayList<>();

try (Scanner s = new Scanner(new FileReader(filename))) {
    while (s.hasNext()) {
        result.add(s.nextLine());
    }
    return result;
}


Scanner

は、区切り文字を使用して入力をトークンに分割します。デフォルトの区切り文字は空白です。利用可能なさまざまな

next



nextInt



nextLong

など)メソッドを使用して、これらのトークンをさまざまなタイプの値に変換できます。

ArrayList<Integer> result = new ArrayList<>();

try (Scanner s = new Scanner(new FileReader(filename))) {
    while (s.hasNext()) {
        result.add(s.nextInt());
    }
    return result;
}

5.

Files.readAllLines

を使う

おそらくファイルを読み込んで、そのすべての行を

ArrayList

に解析する最も簡単な方法は、

Files

クラスで利用可能な**

__ readAllLines()

__メソッドを使用することです。

List<String> result = Files.readAllLines(Paths.get(filename));

このメソッドはcharsetパラメータを取り、特定の文字エンコーディングに従って読み込むこともできます。

Charset charset = Charset.forName("ISO-8859-1");
List<String> result = Files.readAllLines(Paths.get(filename), charset);

6.まとめ

まとめると、

File

の内容を

ArrayList

に読み込む一般的な方法をいくつか説明しました。また、さまざまな方法の長所と短所についても説明しました。

たとえば、効率を上げるために

BufferedReader

を使用して文字をバッファすることができます。あるいは、

Scanner

を使用して、区切り文字を使用してプリミティブを読み取ることもできます。あるいは、基盤となる実装を気にせずに、単に

Files.readAllLines()、

を使用することもできます。

いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/core-java-io[GitHubレポジトリ]にあります。