Javaでのテキストファイルの読み取り

テキストファイルを読み取る方法はたくさんあります。Javaでテキストファイルを読み取る異なる方法を一つずつ見てみましょう。

Javaでテキストファイルを読む

Javaでテキストファイルを読む方法はたくさんあります。テキストファイルは文字で構成されているので、Readerクラスを使用できます。Javaでテキストファイルを読むためのユーティリティクラスもあります。

  1. Filesクラスを使用してJavaでテキストファイルを読む
  2. FileReaderを使用してJavaでテキストファイルを読む
  3. BufferedReaderを使用してJavaでテキストファイルを読む
  4. Scannerクラスを使用してJavaでテキストファイルを読む

これらのクラスを使用してJavaでテキストファイルを読む方法を示す例を見てみましょう。

Javaは、java.nio.file.Filesを使用してテキストファイルを読み取ります。

Filesクラスを使用してファイルのすべての内容をバイト配列に読み込むことができます。Filesクラスには、すべての行を文字列のリストに読み込むメソッドもあります。FilesクラスはJava 7で導入され、ファイルの内容をすべて読み込みたい場合に便利です。ファイルが小さい場合やファイルの内容をすべてメモリに読み込む必要がある場合にのみ、このメソッドを使用する必要があります。

String fileName = "/Users/pankaj/source.txt";
Path path = Paths.get(fileName);
byte[] bytes = Files.readAllBytes(path);
List<String> allLines = Files.readAllLines(path, StandardCharsets.UTF_8);

Javaでテキストファイルを読み取るには、java.io.FileReaderを使用します。

FileReaderを使用してBufferedReaderを取得し、その後ファイルを行単位で読み取ることができます。FileReaderはエンコーディングをサポートせず、システムのデフォルトエンコーディングで動作するため、Javaでテキストファイルを読み取るのにはあまり効率的な方法ではありません。

String fileName = "/Users/pankaj/source.txt";
File file = new File(fileName);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
while((line = br.readLine()) != null){
    //行の処理
    System.out.println(line);
}

Javaは、java.io.BufferedReaderを使用してテキストファイルを読み取ります。

BufferedReaderは、ファイルを行ごとに読み取り、それらに対して処理を行う場合に便利です。大きなファイルの処理に適しており、エンコーディングもサポートしています。BufferedReaderは同期されているため、複数のスレッドから安全にBufferedReader上の読み取り操作を行うことができます。BufferedReaderのデフォルトのバッファサイズは8KBです。

String fileName = "/Users/pankaj/source.txt";
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, cs);
BufferedReader br = new BufferedReader(isr);

String line;
while((line = br.readLine()) != null){
     //行の処理
     System.out.println(line);
}
br.close();

Javaでテキストファイルを読み取るためにScannerを使用する方法

Scannerを使用すると、行ごとにファイルを読み取るか、あるいはJavaの正規表現に基づいて読み取ることができます。Scannerは、デリミタパターンに基づいて入力をトークンに分割します。デフォルトでは、デリミタパターンは空白にマッチします。その結果得られるトークンは、さまざまなnextメソッドを使用して異なる型の値に変換することができます。Scannerクラスは同期されていないため、スレッドセーフではありません。

Path path = Paths.get(fileName);
Scanner scanner = new Scanner(path);
System.out.println("Read text file using Scanner");
//行ごとに読み取る
while(scanner.hasNextLine()){
    //各行を処理する
    String line = scanner.nextLine();
    System.out.println(line);
}
scanner.close();

Javaのファイル読み取りの例

以下は、Javaでテキストファイルを読み取る方法を示す例のクラスです。この例では、Scanner、Files、エンコーディングサポートを使用したBufferedReader、およびFileReaderを使用しています。

package com.journaldev.files;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Scanner;

public class JavaReadFile {

    public static void main(String[] args) throws IOException {
        String fileName = "/Users/pankaj/source.txt";
        
        // Java 7のFilesクラスを使用して小さなファイルを処理し、完全なファイルデータを取得
        readUsingFiles(fileName);
        
        // Scannerクラスを使用して大きなファイルを処理し、行ごとに読み取る
        readUsingScanner(fileName);
        
        // BufferedReaderを使用して行ごとに読み取る
        readUsingBufferedReader(fileName);
        readUsingBufferedReaderJava7(fileName, StandardCharsets.UTF_8);
        readUsingBufferedReader(fileName, StandardCharsets.UTF_8);
        
        // FileReaderを使用して読み取り、エンコーディングサポートなし、効率的でない
        readUsingFileReader(fileName);
    }

    private static void readUsingFileReader(String fileName) throws IOException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        System.out.println("Reading text file using FileReader");
        while((line = br.readLine()) != null){
            //行の処理
            System.out.println(line);
        }
        br.close();
        fr.close();
        
    }

    private static void readUsingBufferedReader(String fileName, Charset cs) throws IOException {
        File file = new File(fileName);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis, cs);
        BufferedReader br = new BufferedReader(isr);
        String line;
        System.out.println("Read text file using InputStreamReader");
        while((line = br.readLine()) != null){
            //行の処理
            System.out.println(line);
        }
        br.close();
        
    }

    private static void readUsingBufferedReaderJava7(String fileName, Charset cs) throws IOException {
        Path path = Paths.get(fileName);
        BufferedReader br = Files.newBufferedReader(path, cs);
        String line;
        System.out.println("Read text file using BufferedReader Java 7 improvement");
        while((line = br.readLine()) != null){
            //行の処理
            System.out.println(line);
        }
        br.close();
    }

    private static void readUsingBufferedReader(String fileName) throws IOException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        System.out.println("Read text file using BufferedReader");
        while((line = br.readLine()) != null){
            //行の処理
            System.out.println(line);
        }
        //リソースをクローズ
        br.close();
        fr.close();
    }

    private static void readUsingScanner(String fileName) throws IOException {
        Path path = Paths.get(fileName);
        Scanner scanner = new Scanner(path);
        System.out.println("Read text file using Scanner");
        //行ごとに読む
        while(scanner.hasNextLine()){
            //各行を処理
            String line = scanner.nextLine();
            System.out.println(line);
        }
        scanner.close();
    }

    private static void readUsingFiles(String fileName) throws IOException {
        Path path = Paths.get(fileName);
        //ファイルをバイト配列に読み取る
        byte[] bytes = Files.readAllBytes(path);
        System.out.println("Read text file using Files class");
        //ファイルをStringリストに読み取る
        @SuppressWarnings("unused")
		List allLines = Files.readAllLines(path, StandardCharsets.UTF_8);
        System.out.println(new String(bytes));
    }

}

ファイルを読み取るためにFiles、BufferedReader、またはScannerクラスを使用する選択は、プロジェクトの要件に依存します。例えば、ファイルを単にログに記録する場合は、FilesとBufferedReaderを使用できます。ファイルをデリミタに基づいて解析する場合は、Scannerクラスを使用するべきです。最後に、このチュートリアルを終える前に、RandomAccessFileについて触れておきたいと思います。これを使用してJavaでテキストファイルを読み取ることができます。

RandomAccessFile file = new RandomAccessFile("/Users/pankaj/Downloads/myfile.txt", "r");
String str;

while ((str = file.readLine()) != null) {
	System.out.println(str);
}
file.close();

これでJavaでのテキストファイルの読み取りの例に関するすべてです。

Source:
https://www.digitalocean.com/community/tutorials/java-read-text-file