Javaファイルを文字列に読み込む

Javaでファイルを文字列に読み込む必要がある場合があります。今日はJavaでファイルを文字列に読み込むさまざまな方法を見ていきます。

Javaでファイルを文字列に読み込む

Javaでファイルを文字列に読み込む方法はたくさんあります。このチュートリアルでは、次の方法を探っていきます。

  1. BufferedReaderを使用してJavaでファイルを文字列に読み込む方法
  2. FileInputStreamを使用してJavaでファイルを文字列に読み込む方法
  3. Filesクラスを使用してJavaでファイルを文字列に読み込む方法
  4. Scannerクラスを使用してファイルを文字列に読み込む方法Apache Commons IO FileUtilsクラスを使用してJavaでファイルを文字列に読み込む方法

さて、これらのクラスを見て、ファイルを文字列に読み込みましょう。

BufferedReaderを使用してJavaでファイルを文字列に読み込む

BufferedReaderreadLineメソッドを使用して、ファイルを行ごとに読み込むことができます。これらを改行文字とともにStringBuilderオブジェクトに追加するだけです。以下は、BufferedReaderを使用してファイルを文字列に読み込むためのコードスニペットです。

BufferedReader reader = new BufferedReader(new FileReader(fileName));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
String ls = System.getProperty("line.separator");
while ((line = reader.readLine()) != null) {
	stringBuilder.append(line);
	stringBuilder.append(ls);
}
// 最後の改行セパレータを削除
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
reader.close();

String content = stringBuilder.toString();

BufferedReaderとchar配列を使用して、ファイルを文字列に読み込むもう一つの効率的な方法があります。

BufferedReader reader = new BufferedReader(new FileReader(fileName));
StringBuilder stringBuilder = new StringBuilder();
char[] buffer = new char[10];
while (reader.read(buffer) != -1) {
	stringBuilder.append(new String(buffer));
	buffer = new char[10];
}
reader.close();

String content = stringBuilder.toString();

FileInputStreamを使用してJavaでファイルを文字列に読み込む

FileInputStreamとbyte配列を使用してファイルを文字列に読み込むことができます。画像、ビデオなどの非文字ベースのファイルを読み込む場合には、このメソッドを使用する必要があります。

FileInputStream fis = new FileInputStream(fileName);
byte[] buffer = new byte[10];
StringBuilder sb = new StringBuilder();
while (fis.read(buffer) != -1) {
	sb.append(new String(buffer));
	buffer = new byte[10];
}
fis.close();

String content = sb.toString();

Filesクラスを使用してJavaでファイルを文字列に読み込む

Filesユーティリティクラスを使用して、すべてのファイル内容を1行のコードで文字列に読み込むことができます。

String content = new String(Files.readAllBytes(Paths.get(fileName)));

Scannerクラスを使用してファイルを文字列に読み込む

Scannerクラスは、Javaでテキストファイルを文字列に読み込むための簡単な方法です。

Scanner scanner = new Scanner(Paths.get(fileName), StandardCharsets.UTF_8.name());
String content = scanner.useDelimiter("\\A").next();
scanner.close();

Apache Commons IOのFileUtilsクラスを使用してJavaでファイルを文字列に読み込む

プロジェクトでApache Commons IOを使用している場合、これはJavaでファイルを文字列に読み込むための簡単で素早い方法です。

String content = FileUtils.readFileToString(new File(fileName), StandardCharsets.UTF_8);

Javaでファイルを文字列に読み込む例

以下は、正しい例外処理を行い、ファイルを文字列に読み込むためのさまざまな方法を示した最終的なプログラムです。

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.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;

import org.apache.commons.io.FileUtils;

public class JavaReadFileToString {

	/**
	 * This class shows different ways to read complete file contents to String
	 * 
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) {
		String fileName = "/Users/pankaj/Downloads/myfile.txt";

		String contents = readUsingScanner(fileName);
		System.out.println("*****Read File to String Using Scanner*****\n" + contents);

		contents = readUsingApacheCommonsIO(fileName);
		System.out.println("*****Read File to String Using Apache Commons IO FileUtils*****\n" + contents);

		contents = readUsingFiles(fileName);
		System.out.println("*****Read File to String Using Files Class*****\n" + contents);

		contents = readUsingBufferedReader(fileName);
		System.out.println("*****Read File to String Using BufferedReader*****\n" + contents);

		contents = readUsingBufferedReaderCharArray(fileName);
		System.out.println("*****Read File to String Using BufferedReader and char array*****\n" + contents);

		contents = readUsingFileInputStream(fileName);
		System.out.println("*****Read File to String Using FileInputStream*****\n" + contents);

	}

	private static String readUsingBufferedReaderCharArray(String fileName) {
		BufferedReader reader = null;
		StringBuilder stringBuilder = new StringBuilder();
		char[] buffer = new char[10];
		try {
			reader = new BufferedReader(new FileReader(fileName));
			while (reader.read(buffer) != -1) {
				stringBuilder.append(new String(buffer));
				buffer = new char[10];
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

		return stringBuilder.toString();
	}

	private static String readUsingFileInputStream(String fileName) {
		FileInputStream fis = null;
		byte[] buffer = new byte[10];
		StringBuilder sb = new StringBuilder();
		try {
			fis = new FileInputStream(fileName);

			while (fis.read(buffer) != -1) {
				sb.append(new String(buffer));
				buffer = new byte[10];
			}
			fis.close();

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fis != null)
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		return sb.toString();
	}

	private static String readUsingBufferedReader(String fileName) {
		BufferedReader reader = null;
		StringBuilder stringBuilder = new StringBuilder();

		try {
			reader = new BufferedReader(new FileReader(fileName));
			String line = null;
			String ls = System.getProperty("line.separator");
			while ((line = reader.readLine()) != null) {
				stringBuilder.append(line);
				stringBuilder.append(ls);
			}
			// 最後のlsを削除する
			stringBuilder.deleteCharAt(stringBuilder.length() - 1);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

		return stringBuilder.toString();
	}

	private static String readUsingFiles(String fileName) {
		try {
			return new String(Files.readAllBytes(Paths.get(fileName)));
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	private static String readUsingApacheCommonsIO(String fileName) {
		try {
			return FileUtils.readFileToString(new File(fileName), StandardCharsets.UTF_8);
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	private static String readUsingScanner(String fileName) {
		Scanner scanner = null;
		try {
			scanner = new Scanner(Paths.get(fileName), StandardCharsets.UTF_8.name());
			// デリミタの正規表現として "\\A"、"\\Z"、"\\z" を使用できます。
			String data = scanner.useDelimiter("\\A").next();
			return data;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		} finally {
			if (scanner != null)
				scanner.close();
		}

	}

}

上記のいずれかの方法を使用して、Javaでファイルの内容を文字列に読み込むことができます。ただし、ファイルサイズが非常に大きい場合は推奨されません。メモリ不足のエラーが発生する可能性があります。

私たちのGitHubリポジトリからさらにJava IOの例をチェックアウトできます。

参考文献:

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