파일에 저장된 텍스트 데이터를 어떻게 문자열로 읽어오나요?
조회수 9763회
아래의 소스코드를 사용해 왔었고요. 그리고 이 방법이 적어도 제가 검색한 사이트에서 가장 많이 사용하는 방법처럼 보입니다.
자바에서 파일의 데이터를 문자열로 읽어오는 더 좋은 다른 방법이 있나요?
private String readFile(String file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader (file));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
String ls = System.getProperty("line.separator");
try {
while((line = reader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append(ls);
}
return stringBuilder.toString();
} finally {
reader.close();
}
}
1 답변
-
파일로부터 모든 텍스트를 읽어오기
자바 버전 7은 유틸리티 메소드를 사용한 쉽고 강력한 방법을 제공합니다.
static String readFile(String path, Charset encoding) throws IOException { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, encoding); }
파일로부터 텍스트를 한 줄씩 읽어오기
자바 버전 7은
List<String>
이라는 파일의 텍스트를 한 줄씩 읽어오는 간편한 방법을 추가하였습니다. 이 방법은 라인 구분자들을 제거해서 한 줄씩 읽어옵니다.ist<String> lines = Files.readAllLines(Paths.get(path), encoding);
메모리 사용
라인 구분자들을 보존할 수 있는 첫 번째 방법은 짧은 시간동안 원시 파일 데이터 (바이트 배열)과 디코드된 문자들 (파일에 8비트가 인코드되었다면, 메모리의 크기는 16비트)을 한번에 메모리에 저장하기 때문에 일시적으로 여러번 파일의 크기만큼 메모리를 요구할 수 있습니다.
라인별로 읽기 위한 두 번째 방법은 디코딩을 위한 입력 바이트 버퍼는 문서 전체를 포함할 필요가 없기 때문에, 좀 더 메모리를 효율적으로 사용합니다. 그러나 사용 가능한 메모리에 대해서 매우 큰 파일에는 여전히 적합하지는 않습니다.
큰 파일을 읽기 위해서 스트림으로부터 텍스트의 청크(chunk)를 읽고 그것을 처리하고, 그리고 나서 그 다음으로 이동하고, 동일한 고정 크기의 메모리 블록을 재사용하기 위한 다른 방법이 필요합니다. 여기서 "크다"라는 것은 컴퓨터의 공간에 따라 다릅니다. 요즘은 이 임계값 (threshold)는 기가바이트 정도가 될 것입니다.
문자 인코딩
질문의 예에서 빠진 것 하나는 문자 인코딩입니다. 설정하고자 하는 인코딩 값이 플랫폼에 기본적으로 정의되어 있는 경우도 있지만, 그것은 매우 드문 경우이다. 그래서 개발자는 문자 인코딩을 지정해서 정의할 수 있어야 합니다.
StandardCharsets
클래스는 모든 자바 실행 환경에서 요구되는 인코딩 값에 대한 상수를 정의하였습니다.String content = readFile("test.txt", StandardCharsets.UTF_8);
Charset
클래스를 사용해서 해당 플랫폼의 기본값을 사용할 수도 있습니다.String content = readFile("test.txt", Charset.defaultCharset());
댓글 입력