新しい Java 8 を使用してファイル内のすべての行を出力するための最も好ましい簡潔な方法は何ですか?
出力は、次のように行ごとにファイルのコピーである必要があります。
[Line 1 ...]
[Line 2 ...]
古いバージョンでそれを行う方法はありますが、質問はラムダを使用したJava-8に関係しています。Java-8 とは何かを示しましょう。
これは、try エンクロージャ内のラムダで新しい Stream を使用します。
次の理由から、これが最も好ましい簡潔な方法だと思います。
1) 完了すると自動的にストリームを閉じ、適切に例外をスローします。
2) これの出力は遅延です。各行は、最後の行が処理された後に読み取られます。これは、元の Java ストリーム ベースのファイル処理仕様に近いものでもあります。
3) ファイル内のデータに最もよく似た方法で各行を印刷します。
4) Files.readAllLines(...) のような中間の List または Array を作成しないため、メモリの消費量が少なくなります。
5) 提供されている Stream オブジェクトには、データを操作するための他の多くの用途と関数 (変換、コレクション、述語など) があるため、これが最も柔軟です。
try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) {
stream.forEach(System.out::println);
}
パスと文字セットが提供され、コンシューマーが任意のオブジェクトを取得できる場合、これも機能します。
try (Stream stream = Files.lines(path,charset)) {
stream.forEach(System.out::println);
}
エラー処理あり:
try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) {
stream.forEach(System.out::println);
} catch (IOException ex) {
// do something with exception
}
Java 8 は本当に必要ありません。
System.out.println(Files.readAllLines(path, charset));
本当にストリームを使用したい場合、またはよりクリーンなプレゼンテーションが必要な場合:
Files.readAllLines(path, charset).forEach(System.out::println);
これが簡単な解決策です:
System.out.println( new String(Files.readAllBytes(Paths.get("sample.java"))) );