파일에 저장된 텍스트 데이터를 어떻게 문자열로 읽어오나요?

조회수 9749회

아래의 소스코드를 사용해 왔었고요. 그리고 이 방법이 적어도 제가 검색한 사이트에서 가장 많이 사용하는 방법처럼 보입니다.

자바에서 파일의 데이터를 문자열로 읽어오는 더 좋은 다른 방법이 있나요?

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 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    파일로부터 모든 텍스트를 읽어오기

    자바 버전 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());
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)