ファイルからすべてのテキストを読み取る
Java 11は、小さなファイルをとして読み取るためのreadString()メソッドを追加し、改行記号をString
保持しています。
String content = Files.readString(path, StandardCharsets.US_ASCII);
Java 7と11の間のバージョンの場合、ユーティリティメソッドにラップされたコンパクトで堅牢なイディオムを次に示します。
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
ファイルからテキスト行を読み取る
Java 7では、ファイルをテキスト行として読み取る便利なメソッドが追加されましたList<String>
。この方法は、行の区切りが各行の終わりから取り除かれるので、「非可逆」です。
List<String> lines = Files.readAllLines(Paths.get(path), encoding);
Java 8はFiles.lines()
を生成するメソッドを追加しましたStream<String>
。繰り返しになりますが、この方法は行の区切りが取り除かれているため、損失を伴います。IOException
ファイルの読み取り中にが発生した場合は、チェックされた例外をスローするラムダを受け入れないためUncheckedIOException
、にラップされStream
ます。
try (Stream<String> lines = Files.lines(path, encoding)) {
lines.forEach(System.out::println);
}
これにStream
はclose()
呼び出しが必要です。これはAPIで十分に文書化されておらず、多くの人がメソッドStream
があることに気づいてさえいないと思いますclose()
。必ず図のようにARMブロックを使用してください。
ファイル以外のソースを使用しているlines()
場合は、BufferedReader
代わりにメソッドを使用できます。
メモリ使用率
改行を保持する最初の方法では、一時的にファイルサイズの数倍のメモリが必要になる可能性があります。これは、生のファイルの内容(バイト配列)とデコードされた文字(エンコードされていてもそれぞれ16ビット)だからです。ファイルの8ビットとして)メモリに一度に常駐します。使用可能なメモリに比べて小さいことがわかっているファイルに適用するのが最も安全です。
2番目の方法である行の読み取りは、デコードのための入力バイトバッファーにファイル全体を含める必要がないため、通常はメモリ効率が向上します。ただし、使用可能なメモリに比べて非常に大きいファイルにはまだ適していません。
大きなファイルを読み取るには、プログラムに別の設計が必要です。プログラムは、ストリームからテキストのチャンクを読み取り、それを処理してから、次に移動し、同じ固定サイズのメモリブロックを再利用します。ここで、「大」はコンピュータの仕様によって異なります。現在、このしきい値は数ギガバイトのRAMになる可能性があります。Stream<String>
入力「レコード」がたまたま個々の行である場合、3番目の方法は、aを使用してこれを行う1つの方法です。(readLine()
メソッドの使用BufferedReader
は、このアプローチに相当する手続きです。)
文字コード
元の投稿のサンプルに欠けているのは、文字エンコーディングです。プラットフォームのデフォルトがあなたの望むものであるいくつかの特別な場合がありますが、それらはまれであり、あなたはあなたの選択を正当化できるはずです。
このStandardCharsets
クラスは、すべてのJavaランタイムに必要なエンコーディング用のいくつかの定数を定義します。
String content = readFile("test.txt", StandardCharsets.UTF_8);
プラットフォームのデフォルトは、Charset
クラス自体から利用できます。
String content = readFile("test.txt", Charset.defaultCharset());
注:この回答は、主にJava 6バージョンを置き換えます。Java 7のユーティリティはコードを安全に簡素化し、マップされたバイトバッファーを使用していた古い回答は、マップされたバッファーがガベージコレクションされるまで、読み取られたファイルが削除されないようにしました。この回答の「編集済み」リンクから古いバージョンを表示できます。