1. 概要

このチュートリアルでは、ファイルをArrayListに読み込むさまざまな方法について説明します。

Javaでファイルを読み取る方法はたくさんあります。 ファイルを読み取ると、そのファイルのコンテンツに対して多くの操作を実行できます。

並べ替えなど、これらの操作の一部では、ファイルのコンテンツ全体をメモリに処理する必要がある場合があります。 このような操作を実行するには、ファイルをArrayまたはListの行または単語のリストとして読み取る必要がある場合があります。

2. FileReaderを使用する

Javaでファイルを読み取る最も基本的な方法は、FileReaderを使用することです。 定義上、 FileReaderは、ファイルから文字のストリームを読み取るための便利なクラスです。

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()呼び出しの数を減らすためです。 X219X]。

BufferedReader のコンストラクターは、Readerを入力として受け取ります。 さらに、コンストラクターでバッファーサイズを指定することもできますが、ほとんどのユースケースでは、デフォルトのサイズは十分に大きいです。

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

Reader クラスから継承されたメソッドに加えて、 BufferedReaderはreadLine()メソッドを提供し、行全体を String:[として読み取ります。 X174X]

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

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

4. スキャナーを使用する

ファイルを読み取るもう1つの一般的な方法は、スキャナーを使用することです。

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

ファイルを読み取る場合、スキャナーファイルまたはファイルリーダーオブジェクトを使用して初期化されます。

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

に似ている BufferedReader、スキャナー提供します読み込まれた行() 行全体を読み取るメソッドさらに それはまた提供します hasNext() より多くの値が読み取りに使用できるかどうかを示す方法:

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. 結論

要約すると、ファイルの内容をArrayListに読み込む一般的な方法について説明しました。 また、さまざまな方法の長所と短所についても説明しました。

たとえば、 BufferedReader を使用して、効率を上げるために文字をバッファリングできます。 または、 Scanner を使用して、区切り文字を使用してプリミティブを読み取ることもできます。 または、基本的な実装を気にせずに、 Files.readAllLines()、を使用することもできます。

いつものように、コードはGitHubリポジトリで入手できます。