Java でのプレーンテキストファイル読み込みのコード例解説
Java でのプレーンテキストファイルの読み込み
Java でプレーンテキストファイルを読み込むには、主に次のクラスが使用されます:
- FileReader: ファイルから文字を読み込むためのクラス。
- BufferedReader: FileReader と組み合わせて使用し、効率的な読み込みを行うためのクラス。
- Scanner: ファイルの内容をトークン化して読み込むためのクラス。
BufferedReader を使った読み込み
最も一般的な方法です。
import java.io.*;
public class ReadFileExample {
public static void main(String[] args) throws IOException {
String fileName = "example.txt";
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
String line;
while ((line = br.readLine()) != null) {
Sys tem.out.println(line);
}
}
}
}
FileReader
オブジェクトを作成し、ファイルを開きます。BufferedReader
オブジェクトを作成して、読み込みをバッファリングします。readLine()
メソッドで1行ずつ読み込み、処理します。try-with-resources
ステートメントを使用して、自動的にリソースをクローズします。
Scanner を使った読み込み
ファイルの内容をトークン化して読み込む場合に便利です。
import java.io.*;
import java.util.Scanner;
public class ReadFileWithScanner {
public static void main(String[] args) throws FileNotFoundException {
Stri ng fileName = "example.txt";
try (Scanner scanner = new Scanner(new File(fileName))) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println( line);
}
}
}
}
hasNextLine()
メソッドで次の行があるかどうかをチェックします。
重要なポイント
- ファイルが存在しない場合や読み込みエラーが発生した場合には、例外が発生します。適切な例外処理が必要です。
- ファイルのエンコーディングを指定する必要がある場合は、
InputStreamReader
を使用します。 - ファイルの全体を読み込んで文字列として扱う場合は、StringBuilder や StringBuffer を使用して効率的に構築できます。
- ファイルの書き込みについては、
FileWriter
やBufferedWriter
を使用します。 - ファイル操作には、
File
クラスも使用されます。
備考
import java.io.*;
public class ReadFileExample {
public static void main(String[] args) throws IOException {
String fileName = "example.txt";
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
String line;
while ((line = br.readLine()) != null) {
Sys tem.out.println(line);
}
}
}
}
解説:
- import文: ファイル入出力に必要な
java.io
パッケージをインポートします。 - BufferedReader: 文字を効率的に読み込むためのクラスです。
- try-with-resources:
BufferedReader
オブジェクトを自動的にクローズします。これにより、リソースのリークを防ぎます。 - readLine(): ファイルから1行ずつ読み込みます。
- whileループ: ファイルの最後まで、
readLine()
で読み込んだ行を処理します。
このコードの動作:
example.txt
という名前のファイルを開きます。- ファイルから1行ずつ読み込み、コンソールに出力します。
- ファイルの最後まで読み込むと、ループが終了します。
コード例2: Scannerを使った読み込み
import java.io.*;
import java.util.Scanner;
public class ReadFileWithScanner {
public static void main(String[] args) throws FileNotFoundException {
Stri ng fileName = "example.txt";
try (Scanner scanner = new Scanner(new File(fileName))) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println( line);
}
}
}
}
- nextLine(): 次の行を読み込みます。
どちらを使うべきか?
- BufferedReader: 大量のテキストデータを効率的に処理する場合に適しています。
- Scanner: ファイルの内容をトークン化して処理する場合や、より柔軟な読み込みが必要な場合に適しています。
- エンコーディング: ファイルのエンコーディングが異なる場合は、
InputStreamReader
を使用して指定する必要があります。 - パフォーマンス: 大量のデータを処理する場合には、パフォーマンスに注意が必要です。バッファサイズや読み込み方法を調整する必要があります。
さらに詳しく知りたい方へ
キーワード
Java, プログラミング, テキストファイル, ファイル読み込み, FileReader, BufferedReader, Scanner, try-with-resources, readLine, hasNextLine, nextLine, 例外処理, エンコーディング, パフォーマンス
応用
- CSVファイルの読み込み: 各行をカンマで分割して処理する。
- 特定の文字列の検索: ファイルの内容を検索し、特定の文字列が含まれる行を抽出する。
- ファイルの比較: 2つのファイルを比較し、異なる部分を抽出する。
Files.readAllLines() メソッド
Java 8 以降で導入された java.nio.file.Files
クラスの readAllLines()
メソッドは、ファイルの全行を List<String> として一度に読み込むことができます。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class Read FileWithLines {
public static void main(String[] args) throws IOException {
String fileName = "example.txt";
List<String> lines = Files.readAllLines(Paths.get(fileName));
lines.forEach(System.out::println);
}
}
- メリット:
- 簡潔で読みやすいコードになる。
- 全行を一度にメモリに読み込むため、ランダムアクセスが高速。
- デメリット:
- 大量のデータを読み込む場合、メモリ不足になる可能性がある。
- 行ごとの処理ではなく、リスト全体に対する処理を行うことが多い。
Stream API
Stream API を利用することで、より関数的なスタイルでファイルを読み込むことができます。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ReadFileWithStream {
public static void main(String[] args) throws IOException {
String fileName = "example.txt";
Files.lines(Paths.get(fileName))
.forEach(System.out::println);
}
}
- メリット:
- 並列処理も可能。
- デメリット:
NIO (New I/O)
NIO は、より高性能な入出力操作を提供します。Channel と Buffer を使用して、非同期な入出力や大容量データの転送を行うことができます。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;
public class ReadFileWithNIO {
public static void main(String[] args) throws IOException {
String fileName = "example.txt";
String content = new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8);
System.out.println(content);
}
}
- メリット:
- 高性能な入出力操作が可能。
- 非同期処理に適している。
- デメリット:
- コードが複雑になりがち。
- NIO の概念を理解する必要がある。
どの方法を選ぶべきか?
- 簡潔さ:
readAllLines()
メソッドが最も簡潔。 - 柔軟性: Stream API は、様々な処理を組み合わせることができる。
- 性能: NIO は、高性能な入出力が必要な場合に適している。
- データ量: 大量のデータを読み込む場合は、メモリ使用量に注意が必要。
Java でプレーンテキストファイルを読み込む方法は、様々なものがあります。それぞれの方法に特徴があるため、処理したいデータの量、処理内容、パフォーマンス要求などに応じて、最適な方法を選択することが重要です。
- パフォーマンス: どの方法が最も高速かは、環境やデータによって異なります。ベンチマークテストを行うことをおすすめします。
- エラー処理: 例外処理は必ず行い、エラーが発生した場合に適切な処理を行うようにしましょう。
- エンコーディング: ファイルのエンコーディングに注意し、適切な文字セットを指定しましょう。
java text file-io