Java で大きなテキストファイルを一行ずつ読み込む方法

Hassan Saeed 2023年10月12日
  1. Java で 1 行ずつファイルを読み取る BufferedReader
  2. Java で行ごとにファイルを読み取る Stream
  3. Java で行ごとにファイルを読み取る Scanner
Java で大きなテキストファイルを一行ずつ読み込む方法

このチュートリアルでは、Java で大規模なテキストファイルを効率的に一行ずつ読み取る方法について説明します。

Java でテキストファイルを読み込む方法は数多くあります。しかし、このチュートリアルでは、大規模なテキストファイルを読むことに特化しており、大きなテキストファイルを素早く読むための最も効率的な 3つの方法について説明します。

Java で 1 行ずつファイルを読み取る BufferedReader

Java の BufferedReader クラスは、与えられた文字入力ストリームからテキストを読み込み、文字をバッファリングして、文字、配列、および行の効率的な読み込みを提供します。このメソッドは、かなり大きなファイルサイズの入力ファイルに対して、効率的な行単位の読み込みを提供します。

以下の例は、BufferedReader を用いて txt ファイルを読み込んでその内容を一行ずつ出力する例です。

import java.io.*;

public class Main {
  public static void main(String[] args) {
    String file = "my-file.txt";
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
      String line;
      while ((line = br.readLine()) != null) {
        System.out.println(line);
      }
    } catch (IOException e) {
      System.out.println("An error occurred.");
      e.printStackTrace();
    }
  }
}

Java で行ごとにファイルを読み取る Stream

Java 8 以上のユーザは、Stream を用いて大容量のファイルを一行ずつ読み込むこともできます。以下の例は、txt ファイルを読み込んでその内容を一行ずつ出力するための Stream の使い方を示しています。

import java.io.*;
import java.nio.file.*;
import java.util.stream.*;

public class Main {
  public static void main(String[] args) {
    String file = "my-file.txt";
    try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
      stream.forEach(System.out::println);
    } catch (IOException e) {
      System.out.println("An error occurred.");
      e.printStackTrace();
    }
  }
}

上記の 2つの方法は、ファイル全体をメモリに読み込むのではなく、入力ファイルを 1 行ずつ読み込む。したがって、メモリに完全に読み込めない巨大なファイルがある場合には、これら 2つの方法は非常に効率的です。

しかし、入力ファイルを完全に読み込めるだけのメモリ容量がある場合は、以下の方法を試すこともできます。

Java で行ごとにファイルを読み取る Scanner

Java の Scanner クラスは、正規表現を使ってプリミティブ型や文字列を解析することができるシンプルなテキストスキャナです。スキャナー(ファイルソース) はファイル全体をメモリに読み込み、一行ずつ処理します。

以下の例は、Scanner を使って txt ファイルを読み込んでその内容を一行ずつ出力する例です。

import java.io.*;
import java.util.*;

public class Main {
  public static void main(String[] args) throws IOException {
    String fileName = "my-file.txt";
    Scanner scan = new Scanner(new File(fileName));
    while (scan.hasNextLine()) {
      String line = scan.nextLine();
      System.out.println(line);
    }
  }
}

Java で大きなテキストファイルを読み込んで一行ずつ処理する 3つの方法について説明しました。それぞれの方法には、特定のシナリオでどの方法を使用するかを決める際に考慮しなければならないいくつかの制約と利点がありました。

関連記事 - Java File