웹사이트 검색

Java 파일을 문자열로 읽기


때때로 파일 작업을 하는 동안 Java에서 파일을 String으로 읽어야 합니다. 오늘은 Java에서 파일을 String으로 읽어오는 다양한 방법에 대해 알아보겠습니다.

Java 파일을 문자열로 읽기

Java에서 파일을 문자열로 읽는 방법에는 여러 가지가 있습니다. 이 자습서에서는 다음 방법을 살펴보겠습니다.

  1. BufferedReader를 사용하여 자바에서 파일을 문자열로 읽기
  2. FileInputStream을 사용하여 Java에서 문자열로 파일 읽기
  3. Java는 Files 클래스를 사용하여 파일을 문자열로 읽습니다.
  4. 스캐너 클래스를 사용하여 파일을 문자열로 읽기
  5. Apache Commons IO FileUtils 클래스를 사용하여 Java에서 파일을 문자열로 읽기

BufferedReader를 사용하여 Java 파일을 문자열로 읽기

BufferedReader readLine 메서드를 사용하여 파일을 한 줄씩 읽을 수 있습니다. 우리가 해야 할 일은 개행 문자가 있는 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);
}
// delete the last new line separator
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과 바이트 배열을 사용하여 파일을 문자열로 읽을 수 있습니다. 이미지, 비디오 등과 같은 비문자 기반 파일을 읽으려면 이 방법을 사용해야 합니다.

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에서 파일을 문자열로 읽기

파일 유틸리티 클래스를 사용하여 한 줄의 코드로 모든 파일 내용을 문자열로 읽을 수 있습니다.

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

스캐너 클래스를 사용하여 파일을 문자열로 읽기

스캐너 클래스는 자바에서 텍스트 파일을 문자열로 읽는 빠른 방법입니다.

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

Java는 Apache Commons IO FileUtils 클래스를 사용하여 파일을 문자열로 읽습니다.

프로젝트에서 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);
			}
			// delete the last 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());
			// we can use Delimiter regex as "\\A", "\\Z" or "\\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 예제를 확인할 수 있습니다.

참조:

  • BufferedReader API 문서
  • 파일 API 문서