Java java.nio.file.Files.lines()メソッド
Files.lines()このメソッドは Java 8 で導入された静的メソッドで、java.nio.file.Filesクラス内にあります。Stream<String>)を返し、その中の各文字列はファイルの1行を表します。
メソッド定義
public static Stream<String> lines(Path path, Charset cs) throws IOException
このメソッドには2つのオーバーロード版があります:
- 最初のバージョンはデフォルトの文字セット(UTF-8)でファイルを読み取ります
- 2番目のバージョンでは文字セットを指定できます
コア機能
1. 遅延評価(Lazy Evaluation)
lines()このメソッドが返すのはストリーム(Stream)であり、遅延評価されることを意味します。ファイルは一度にすべてメモリに読み込まれるのではなく、必要に応じて読み取られるため、大きなファイルの処理に特に有利です。
2. 自動リソース管理
ストリーム操作が完了すると(正常終了でも例外による中断でも)、ストリームは自動的に基盤のファイルリソースを閉じます。ただし、ベストプラクティスとしては、リソースが確実に解放されるように try-with-resources 文を使用することが推奨されます。
3. 行終端文字の処理
このメソッドは異なる行終端文字を自動的に認識します:
\n(Unix/Linux)\r\n(Windows)\r(旧Mac)
基本的な使い方
例1:ファイルの簡単な読み取り
例
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:指定文字セットの使用
例
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);
注意事項
リソース管理:ストリームは自動的に閉じられますが、複雑なストリーム操作では、明示的に try-with-resources を使用することが推奨されます。
パフォーマンスの考慮事項:小さなファイルの場合、
Files.readAllLines()より簡単なこともありますが、大きなファイルの場合は、lines()より良い選択肢です。文字セットの問題:ファイルのエンコーディングがシステムのデフォルトエンコーディングと異なる場合は、必ず正しい文字セットを指定してください。そうしないと文字化けが発生する可能性があります。
例外処理:IO操作は例外をスローする可能性があるため、適切に処理する必要があります。
性能比較
| メソッド | 特徴 | 適用シーン |
|---|---|---|
Files.lines() |
遅延ロード、メモリ効率が高い | 大きなファイルの処理 |
Files.readAllLines() |
すべての行を一度にメモリにロード | 小さなファイルの処理 |
BufferedReader.readLine() |
従来の方法、手動制御 | きめ細かい制御が必要な場合 |
まとめ
Files.lines()このメソッドは、Java 8 の Stream API と NIO の効率的なファイル処理能力を組み合わせ、ファイル読み取りに現代的で簡潔なソリューションを提供します。大きなファイルの処理や複雑な行単位の操作に特に適しています。このメソッドを習得することで、ファイル処理コードの可読性と効率を大幅に向上させることができます。
実際の開発では、ファイルサイズ、処理要件、パフォーマンス要件に応じて、適切に選択しますlines()、readAllLines()または従来のIOメソッドを使用して、最適なファイル処理コードを書くことができます。