Javaでファイルを読み込む方法を徹底解説!BufferedReader・Files・Scannerの使い分け
Javaには、ファイルを読み込むための方法が複数用意されています。それぞれの方法には得意・不得意があり、ファイルの種類や状況に応じて適切なものを選ぶことが重要です。大きなファイルに向いているものもあれば、小さなファイルの読み込みに適したものもあります。
このチュートリアルでは、以下のJavaクラスを使用してファイルを読み込む方法を解説します。
- BufferedReader
- Files
- Scanner
この記事では、srcディレクトリに保存されたパスsrc/file.txtのファイルを使用します。読み進める前に、このファイルに数行のテキストを保存しておいてください。
注意:これらの実装を使用する際は、コーディングのベストプラクティスに従い、例外処理(エラーハンドリング)を適切に行うようにしてください。
BufferedReaderを使ってテキストファイルを読み込む
BufferedReaderクラスは文字入力ストリームを読み込むクラスです。デフォルトで8KBのバッファに文字を蓄積することで、読み込み処理を効率化しています。ファイルを1行ずつ読み込みたい場合、BufferedReaderは非常に良い選択肢となります。
また、BufferedReaderは大きなファイルの読み込みにも高いパフォーマンスを発揮します。
import java.io.*;
public class FileReaderWithBufferedReader {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
//必要に応じて行を処理する
System.out.println(curLine);
}
bufferedReader.close();
}
}
readLine()メソッドは、ファイルの末尾に到達するとnullを返します。この仕組みを利用してwhileループで全行を読み込んでいます。
注意:読み込みが完了したら、必ずファイルをクローズするのを忘れないでください。
BufferedReaderでUTF-8エンコードのファイルを読み込む
BufferedReaderクラスを使用すれば、UTF-8でエンコードされたファイルも読み込めます。
その場合は、BufferedReaderインスタンスを作成する際に、InputStreamReaderオブジェクトを渡します。
import java.io.*;
public class EncodedFileReaderWithBufferedReader {
public static void main(String[] args) throws IOException {
String file = "src/fileUtf8.txt";
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
//必要に応じて行を処理する
System.out.println(curLine);
}
}
}
Filesクラスを使ってファイルを読み込む
Java 7で導入されたJava NIOのFilesクラスは、ファイルを操作する静的メソッドだけで構成されています。
Filesクラスを使うと、ファイルの内容全体を配列として一括で読み込めます。そのため、比較的小さなファイルの読み込みに適しています。
それでは、Filesクラスの具体的な使い方を見ていきましょう。
Filesクラスで小さなファイルを読み込む
FilesクラスのreadAllLines()メソッドを使うと、ファイルの内容全体を読み込み、各行を文字列としてリストに格納できます。
FilesクラスはファイルのPathオブジェクトを受け取るため、Pathクラスを使ってファイルへのパスを取得します。
import java.io.IOException;
import java.nio.file.*;
import java.util.*;
public class SmallFileReaderWithFiles {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
Path path = Paths.get(file);
List<String> lines = Files.readAllLines(path);
}
}
また、文字列のリストではなくバイト配列としてデータを取得したい場合は、readAllBytes()メソッドを使用します。
byte[] bytes = Files.readAllBytes(path);
Filesクラスで大きなファイルを読み込む
Filesクラスで大きなファイルを読み込みたい場合は、newBufferedReader()メソッドでBufferedReaderクラスのインスタンスを取得し、1行ずつ読み込むのがおすすめです。
import java.io.*;
import java.nio.file.*;
public class LargeFileReaderWithFiles {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
Path path = Paths.get(file);
BufferedReader bufferedReader = Files.newBufferedReader(path);
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
System.out.println(curLine);
}
bufferedReader.close();
}
}
Files.lines()でファイルを読み込む
Java 8では、Filesクラスに新しいメソッドが追加されました。lines()メソッドを使うと、ファイル全体を文字列のStreamとして読み込めます。
import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;
public class FileReaderWithFilesLines {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
Path path = Paths.get(file);
Stream<String> lines = Files.lines(path);
lines.forEach(s -> System.out.println(s));
lines.close();
}
}
Stream APIと組み合わせることで、フィルタリングやマップ処理など、柔軟なデータ操作が可能になります。
Scannerを使ってテキストファイルを読み込む
Scannerクラスは、指定した区切り文字(デリミタ)を使ってファイルの内容を分割し、少しずつ読み込むことができます。このアプローチは、区切り文字で区切られたコンテンツを読み込むのに最適です。
例えば、空白で区切られた整数のリストや、カンマで区切られた文字列のリストを読み込む場合、Scannerクラスが理想的です。
Scannerクラスのデフォルトの区切り文字は空白ですが、別の文字や正規表現に変更することもできます。また、next()、nextInt()、nextLine()、nextByte()など、さまざまなnext系メソッドが用意されており、コンテンツを異なる型に変換しながら読み込めます。
import java.io.IOException;
import java.util.Scanner;
import java.io.File;
public class FileReaderWithScanner {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
Scanner scanner = new Scanner(new File(file));
scanner.useDelimiter(" ");
while(scanner.hasNext()){
String next = scanner.next();
System.out.println(next);
}
scanner.close();
}
}
上記の例では、区切り文字を空白に設定し、next()メソッドで空白によって区切られた次の部分を順番に読み込んでいます。
ファイル全体を一度に読み込む
Scannerクラスを使えば、ループを回さずにファイル全体を一度に読み込むことも可能です。その場合は、区切り文字として"\\Z"(ファイル終端を表す正規表現)を指定します。
scanner.useDelimiter("\\Z");
System.out.println(scanner.next());
scanner.close();
注意:Scannerクラスは同期化されていないため、スレッドセーフではありません。マルチスレッド環境で使用する際は注意が必要です。
まとめ
このチュートリアルで見てきたように、Javaにはテキストファイルを読み込むためのさまざまな方法があり、タスクの性質に応じて最適なものを選択できます。
- 大きなファイルを1行ずつ読み込みたい場合:
BufferedReaderを使用する - 区切り文字で区切られたコンテンツを読み込みたい場合:
Scannerクラスを使用する - 小さなファイルから大きなファイルまで幅広く対応したい場合:Java NIOの
Filesクラスを使用する
それぞれの特徴を理解して、目的に合った方法を選びましょう。
-
Rubyでファイルを読み書きする方法を実例つきで徹底解説
Rubyでファイルの読み書きができるようになると、ファイルからデータを抽出したり、新しいファイルを作成したり、必要な情報を素早く見つけたりできるようになります。この記事では、Rubyにおけるファイル操作の基本を、実際のコード例とともにわかりやすく解説します。 この記事で学べること Rubyでファイルを読み込む方法 Rubyでファイルに書き込む方法 覚えておきたいFileクラスのメソッド ディレクトリ操作の基礎 FileUtilsモジュールの使い方 まとめ それでは始めましょう! Rubyでファイルを読み込む方法 Rubyでファイルを読み込む基本的な流れは、次の3ステップです。 op
-
Windows 10でメモリダンプファイル(.dmp)を読み取る方法|BlueScreenViewとWinDbgの使い方
PCが突然クラッシュした経験はありませんか?その際に表示されるのが、いわゆる「ブルースクリーン(BSOD)」です。BSODにはクラッシュの原因が一瞬表示されますが、数秒で画面が消えてしまうため、その場で原因を分析することはほぼ不可能です。幸いなことに、Windowsがクラッシュすると、シャットダウンの直前にクラッシュに関する情報を記録した「クラッシュダンプファイル(.dmp)」や「メモリダンプ」が自動的に作成されます。このダンプファイルを解析することで、エラーの原因を特定し、トラブルシューティングにつなげることができます。メモリダンプファイルとは?BSODが表示されると同時に、Windowsは