Java java.nio.file.Files.lines()メソッド

Java java.nio.file.Files

Files.lines()このメソッドは Java 8 で導入された静的メソッドで、java.nio.file.Filesクラス内にあります。Stream<String>)を返し、その中の各文字列はファイルの1行を表します。

メソッド定義

public static Stream<String> lines(Path path) throws IOException
public static Stream<String> lines(Path path, Charset cs) throws IOException

このメソッドには2つのオーバーロード版があります:

  1. 最初のバージョンはデフォルトの文字セット(UTF-8)でファイルを読み取ります
  2. 2番目のバージョンでは文字セットを指定できます

コア機能

1. 遅延評価(Lazy Evaluation)

lines()このメソッドが返すのはストリーム(Stream)であり、遅延評価されることを意味します。ファイルは一度にすべてメモリに読み込まれるのではなく、必要に応じて読み取られるため、大きなファイルの処理に特に有利です。

2. 自動リソース管理

ストリーム操作が完了すると(正常終了でも例外による中断でも)、ストリームは自動的に基盤のファイルリソースを閉じます。ただし、ベストプラクティスとしては、リソースが確実に解放されるように try-with-resources 文を使用することが推奨されます。

3. 行終端文字の処理

このメソッドは異なる行終端文字を自動的に認識します:

  • \n(Unix/Linux)
  • \r\n(Windows)
  • \r(旧Mac)

基本的な使い方

例1:ファイルの簡単な読み取り

例

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

public class FilesLinesExample {
    public static void main(String[] args) {
        Path path = Paths.get("example.txt");
       
        try (Stream<String> lines = Files.lines(path)) {
            lines.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

例2:指定文字セットの使用

例

try (Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)) {
    lines.filter(line -> !line.isEmpty())
         .forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

高度な使い方

1. Stream API との連携

例

// 空でない行の数を数える
long count = Files.lines(path)
                 .filter(line -> !line.trim().isEmpty())
                 .count();

// 特定の単語を含む行を探す
List<String> targetLines = Files.lines(path)
                               .filter(line -> line.contains("important"))
                               .collect(Collectors.toList());

2. 並列処理

例

// ファイルの行を並列処理する
Files.lines(path)
     .parallel()
     .map(String::toUpperCase)
     .forEachOrdered(System.out::println);

注意事項

  1. リソース管理:ストリームは自動的に閉じられますが、複雑なストリーム操作では、明示的に try-with-resources を使用することが推奨されます。

  2. パフォーマンスの考慮事項:小さなファイルの場合、Files.readAllLines()より簡単なこともありますが、大きなファイルの場合は、lines()より良い選択肢です。

  3. 文字セットの問題:ファイルのエンコーディングがシステムのデフォルトエンコーディングと異なる場合は、必ず正しい文字セットを指定してください。そうしないと文字化けが発生する可能性があります。

  4. 例外処理:IO操作は例外をスローする可能性があるため、適切に処理する必要があります。


性能比較

メソッド 特徴 適用シーン
Files.lines() 遅延ロード、メモリ効率が高い 大きなファイルの処理
Files.readAllLines() すべての行を一度にメモリにロード 小さなファイルの処理
BufferedReader.readLine() 従来の方法、手動制御 きめ細かい制御が必要な場合

まとめ

Files.lines()このメソッドは、Java 8 の Stream API と NIO の効率的なファイル処理能力を組み合わせ、ファイル読み取りに現代的で簡潔なソリューションを提供します。大きなファイルの処理や複雑な行単位の操作に特に適しています。このメソッドを習得することで、ファイル処理コードの可読性と効率を大幅に向上させることができます。

実際の開発では、ファイルサイズ、処理要件、パフォーマンス要件に応じて、適切に選択しますlines()、readAllLines()または従来のIOメソッドを使用して、最適なファイル処理コードを書くことができます。

Java java.nio.file.Files

その他の拡張