자바 텍스트 파일 읽는 방법

기본적으로 텍스트 파일을 불러오는 방법은 매우 간단합니다.

파일 불러오기 -> 파일 읽기 -> 저장 및 출력 

저는 이렇게 3단계로 분류하는데 하나씩 살펴볼게요.

File note = new File("C:/Users/user/Desktop/js/note.txt");

첫 번째 파일 불러오기입니다.

해당 메모장의 경로를 입력해주시면 불러오기가 가능합니다.

이 코드를 복사하거나 입력하시면 File 부분이 빨간색으로 나올 텐데 걱정 마시고 마우스를 올린 뒤 import 해주시면 됩니다.

import java.io.File;

그러면 맨 위 패키지 아래 import 된 걸 보실 수 있어요.

BufferedReader br = new BufferedReader(new FileReader(note));

두 번째 파일 읽기입니다.

이 코드도 위 불러오기와 마찬가지로 빨간 줄이 뜨면 import 해주시면 됩니다. 

import를 했는데 계속 빨간색이 남아 있을 겁니다. 마우스를 올려보면 try/catch를 하라고 나와있습니다.

try/catch는 예외처리입니다. 예외처리에 대해서는 좀 더 나중에 다루도록 할게요.

지금은 오류가 나야 하는 부분을 예외 처리해서 사용할 수 있도록 만든다고 생각하시면 됩니다.

불러오기에서 선언한 note를 fileReader에 넣음으로써 해당 경로의 메모장을 읽어 올 수 있게 됐습니다.

String str = br.readLine(); System.out.println(str);

세 번째 저장 및 출력입니다.

br.readLine 은 메모장을 문자열로 읽어 온다는 뜻입니다.

문자열로 읽어온 값을 str에 대입하고 콘솔로 출력하는 코드입니다.

이렇게 3가지로 분류해봤고 이제 합쳐진 코드를 볼게요.

File note = new File("C:/Users/user/Desktop/js/note.txt"); try{ BufferedReader br = new BufferedReader(new FileReader(note)); String str = br.readLine(); System.out.println(str); br.close(); } catch (NullPointerException e){ // null이 있을 경우 e.getStackTrace(); } catch (FileNotFoundException e){ // 파일을 찾을 수 없는 경우 e.getStackTrace(); } catch (IOException e){ // 파일 읽기 중 에러가 발생한 경우 e.getStackTrace(); }

try/catch는 이렇게 예외 하는 데 사용한다고 생각하시면 됩니다.

note메모장에 A , B , C 가 있을 경우 위 코드는 A만 가져옵니다.

당연히 한 번만 읽었으니 당연한 결과입니다.

File note = new File("C:/Users/user/Desktop/js/note.txt"); try{ BufferedReader br = new BufferedReader(new FileReader(note)); String str = br.readLine(); // 변수 선언과 첫번째 문자열 대입 while(str != null){ // 읽어오는 문자열이 null이 나올때까지 루프 System.out.println(str); // 출력 str = br.readLine(); // 메모장 다음 문자열 읽기 } br.close(); } catch (NullPointerException e){ // null이 있을 경우 e.getStackTrace(); } catch (FileNotFoundException e){ // 파일을 찾을 수 없는 경우 e.getStackTrace(); } catch (IOException e){ // 파일 읽기 중 에러가 발생한 경우 e.getStackTrace(); }

while문을 사용하면 손쉽게 모든 값을 읽어 올 수 있습니다.

단 여기서도 문제가 있어요. 메모장을 읽기만 한다면 여기서 끝이겠지만 메모장의 값을 사용하기 위해서는

이런 방식으로는 불가능합니다.

srt을 계속 초기화하기 때문에 이전 값을 은 지워지기 때문이에요.

ArrayList<String> N_list = new ArrayList<String>(); // 리스트 선언 File note = new File("C:/Users/user/Desktop/js/note.txt"); try{ BufferedReader br = new BufferedReader(new FileReader(note)); String str = br.readLine(); while(str != null){ N_list.add(str); ArrayList에 저장 str = br.readLine(); } br.close(); } catch (NullPointerException e){ // null이 있을 경우 e.getStackTrace(); } catch (FileNotFoundException e){ // 파일을 찾을 수 없는 경우 e.getStackTrace(); } catch (IOException e){ // 파일 읽기 중 에러가 발생한 경우 e.getStackTrace(); } for(i = 0; i < N_list.size(); i++){ // 저장된 Array의 크기만큼 루프 System.out.println(N_list.get(i)); // 순서대로 출력 }

저는 ArrayList를 사용했습니다.

이렇게 리스트에 이전 값도 모두 저장돼있는 걸 보실 수 있습니다.

생각보다 쉬운 작업이죠? 저도 처음에는 이게 뭔가 싶었는 데 사용하다 보니 금방 활용을 잘하게 되더라고요.

파일만 불러와서 저장했을 뿐인데 벌써 많은걸 할 수 있게 됐습니다. 문제들을 저장해서 랜덤 하게 풀 수 있는 알고리즘을 만들 수도 있고요. 

예외처리도 하다 보면 어렵지 않다는 걸 느끼실 거예요. 

java에서 텍스트 파일의 내용을 읽는 방법

1. Filereader : Character 파일을 읽는 기능 제공 > 한글자씩 읽어옴( 사실 잘 쓰지 않음)

2. BufferReader : Buffer를 사용. filereader보다 좀 더 효율적으로 파일을 읽어옴

3. Scanner : 파일이나 입력값을 공백문자들을 이용해서 잘라 읽을 수 있음.

                가장 흔하게 사용되는 방법 중 하나

4. Files : java 7이후로 사용. 파일 내용 전체를 List나 array, String에 쉽게 담을 수 있음

'공부 > Java' 카테고리의 다른 글

[Java]Java의 시간 다루기  (0) [Java] DFS/BFS 탐색 알고리즘  (0) [SWEA]1225_암호생성기 JAVA 풀이  (0)
2022.09.04
2022.02.08
2022.02.08

이번에는 텍스트 파일에 기록된 텍스트를 읽는 방법에 대해 알아봅니다.

FileReader 클래스

FileReader는 텍스트 파일로부터 텍스트를 읽기 위한 클래스입니다. 이를 위해 이 클래스는 다양한 메소드들을 제공합니다.

파일로부터 텍스트를 읽는 메소드들

파일로부터 텍스트를 읽기 위한 FileReader 클래스의 메소드들을 소개합니다.

읽기 메소드들

설명

int read()

파일로부터 한 글자를 읽습니다. 이 메소드의 리턴 값으로 어떤 글자인지 파악할 수 있습니다.

int read(char[] buf)

 파일로부터 buf.length 개의 문자들을 buf에 읽습니다. 리턴 값은 읽은 문자의 개수 또는 -1입니다. 파일의 마지막 글자까지 다 읽은 후 이 메소드를 호출할 때 -1이 리턴됩니다. 이것은 더 이상 읽을 문자가 없음을 의미합니다.

그 외 다른 메소드들이 있습니다. 자세한 내용은 오라클 또는 안드로이드 매뉴얼을 참고하시기 바랍니다.

//docs.oracle.com/javase/7/docs/api/java/io/FileReader.html

//developer.android.com/reference/java/io/FileReader.html

FileReader 객체 생성시 발생할 수 있는 예외

만약 읽으려는 파일이 존재하지 않으면, FileNotFoundException 예외가 발생됩니다. 파일을 읽을 때에도 예외가 발생할 수 있으며, 관련 클래스는 IOException입니다.

참고로 입출력과 관계된 일반적인 클래스가 바로 IOException입니다. FileNotFoundException은 그것의 자식 클래스입니다. 

텍스트 파일로부터 텍스트를 읽는 과정

1. 텍스트 파일을 읽기 위한 FileReader 객체를 생성하세요. 파일 이름이 sample.txt이면, 다음과 같이 코드를 작성합니다.

FileReader textFileReader = new FileReader("sample.txt");

BufferedReader 객체를 생성하여 FileReader 객체를 감싸는 것도 가능합니다. 읽기 속도를 향상시키려면, 전자를 활용하는 것이 좋습니다. 

BufferedReader bufferedReader = new BufferedReader(new FileReader("sample.txt"));

2. 읽을 파일이 존재하지 않을 때 예외 처리 여부를 결정하세요.

예외 처리를 직접 하는 경우

예외를 직접 처리하려면, try ... catch 문을 정의하세요. 파일을 생성하는 코드는 try 문 안에 작성되어야 합니다. catch 문은 어떤 프로그램을 만드냐에 따라 천차만별로 구현됩니다. 여기에서는 간단히 예외 객체가 printStackTrace 메소드를 호출하는 것으로 정했습니다. 추가로 파일이 존재하지 않음을 화면으로 알리는 걸 생각해 볼 수 있겠네요.

FileReader textFileReader;

try {

    textFileReader = new FileReader("sample.txt");

}

catch (FileNotFoundException e) {

    System.out.println("sample.txt 파일이 존재하지 않습니다.");

    e.printStackTrace();

}

예외 처리를 직접 하지 않는 경우

예외 처리를 직접 하지 않으면, 파일을 생성하는 메소드의 프로토타입의 오른쪽에 throws FileNotFoundException을 추가하세요. 메소드 이름이 foo라면, 다음과 같이 작성하시면 되겠습니다.

void foo() throws FileNotFoundException {

    FileReader textFileReader = new FileReader("sample.txt");    // (A)

    // ...

}

sample.txt 파일이 존재하지 않으면, (A) 아래의 코드는 더 이상 실행되지 않습니다.

3. 파일을 읽는 코드를 작성하세요. n개의 문자들을 읽으려면, 다음과 같이 코드를 작성하세요.

FileNotFoundException 예외 처리를 하지 않는 경우

int n = 10; // n의 값은 임의로 정했어요.

char[] buf = new char[n];

textFileReader.read(buf);

FileNotFoundException 예외 처리를 하는 경우

FileReader textFileReader;

try {

    textFileReader = new FileReader("sample.txt");

    int n = 10; // n의 값은 임의로 정했어요.

    char[] buf = new char[n];

    textFileReader.read(buf);

}

catch (FileNotFoundException e) {

    System.out.println("sample.txt 파일이 존재하지 않습니다.");

    e.printStackTrace();

}

4. 파일 읽기와 관련된 예외 처리를 할 것인지를 결정하세요. 이것을 처리하지 않는다면, 메소드가 던질 예외의 클래스 이름을 FileNotFoundException에서 IOException으로 변경하세요. 코드를 추가 작성하실 필요는 없습니다. 직접 처리하려면, 이 예외를 처리하는 catch 문을 추가하면 됩니다. 예외 객체의 클래스 이름은 IOException입니다.

FileReader textFileReader;

try {

    textFileReader = new FileReader("sample.txt");

    int n = 10; // n은 임의의 양수로 정하세요.

    char[] buf = new char[n];

    textFileReader.read(buf);

}

catch (FileNotFoundException e) {

    System.out.println("sample.txt 파일이 존재하지 않습니다.");

    e.printStackTrace();

}

catch (IOException e) {

    System.out.println("sample.txt 파일의 읽기를 수행할 수 없습니다.");

    e.printStackTrace();

}

위 코드에서는 파일이 발견되지 않는 경우에만 catch (FileNotFoundException e)가 실행됩니다. 그 외 입출력 예외는 catch (IOException e)가 처리 합니다.

5. 3에 이어 추가로 파일을 읽으려면 read 메소드를 반복적으로 호출하시면 됩니다. 파일의 처음부터 끝까지 반복적으로 읽으려면, for나 while 등과 같은 반복문 안에 이 메소드를 호출하는 것이 좋습니다. 더 이상 읽을 내용이 없으면, read 메소드는 -1을 리턴합니다. 반복을 할지는 read의 리턴 값이 -1인지 아닌지를 확인하면 되겠습니다.

FileNotFoundException 예외 처리를 하지 않는 경우

int n = 10;    // n은 임의의 양수로 정하세요.

char[] buf = new char[n];

StringBuilder contentReceiver = new StringBuilder();

while (textFileReader.read(buf) > 0)

    contentReceiver.append(buf);

FileNotFoundException 예외 처리를 하는 경우

FileReader textFileReader;

try {

    textFileReader = new FileReader("sample.txt");

    int n = 10; // n은 임의의 양수로 정하세요.

    char[] buf = new char[n];

    StringBuilder contentReceiver = new StringBuilder();

    while (textFileReader.read(buf) > 0)

        contentReceiver.append;

}

catch (FileNotFoundException e) {

    System.out.println("sample.txt 파일이 존재하지 않습니다.");

    e.printStackTrace();

}

catch (IOException e) {

    System.out.println("sample.txt 파일의 읽기를 수행할 수 없습니다.");

    e.printStackTrace();

}

5. 파일 읽기가 완료되었으면, 리더 객체의 close 메소드를 호출하세요.

FileNotFoundException 예외 처리를 하지 않는 경우

FileNotFoundException 예외 처리를 하는 경우

finally 문을 추가하시고, 그 안에 close 메소드를 호출하시는 것이 좋습니다.

try {

    // ...

}

catch (FileNotFoundException e) {

    // ...

}

catch (IOException e) {

    // ...

}

finally {

    textFileReader.close();

}

예 - 텍스트 파일을 읽고 내용 전체를 문자열 객체에 담는 프로그램

이 프로그램은 sample.txt 파일을 읽고 그것의 내용을 화면으로 보여줍니다. 이를 위해 텍스트 파일 전체의 내용을 읽고 그것을 문자열 객체로 리턴하는 메소드 readContentFrom을 구현하였습니다. 그것을 실행해 보았습니다. 전체 코드는 다음과 같습니다.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 

public class AppendingTextFile { 

    public static void main(String[] args)
    {
        String textFileName = "sample.txt";
        String contentFromSample;
 

        try {
            contentFromSample = readContentFrom(textFileName);
            System.out.println(textFileName + " 파일의 내용: ");
            System.out.println(contentFromSample);
        }
        catch (FileNotFoundException e) {
            System.out.println(textFileName + " 파일이 존재하지 않습니다.");
 

            e.printStackTrace();
        }
        catch (IOException e) {
            System.out.println(textFileName + " 파일을 읽을 수 없습니다.");
 

            e.printStackTrace();
        }
    }

        public static String readContentFrom(String textFileName) throws IOException {
        BufferedReader bufferedTextFileReader = new BufferedReader(new FileReader(textFileName));
        StringBuilder contentReceiver = new StringBuilder();
        char[] buf = new char[1024];

  

        while (bufferedTextFileReader.read(buf) > 0) {
            contentReceiver.append(buf);
        }
 

        return contentReceiver.toString();
    }
 

}

sample.txt

sample.txt 파일을 만들고 그것을 프로젝트 폴더에 복사하세요.

Eating breakfast...
Studying English...
Eating lunch...
Studying Mathematics...
Eating dinner...

실행 결과

실행 결과는 다음과 같습니다.

sample.txt 파일의 내용:
Eating breakfast...
Studying English...
Eating lunch...
Studying Mathematics...
Eating dinner...

readContentFrom 메소드의 작성 취지 

위 코드를 보시면 아시겠지만, 텍스트 파일의 내용 전체를 문자열 객체로 읽기 위해 작성한 코드의 양이 적지 않습니다. 보다 커다란 프로그램을 만들 때에는 파일을 읽는 작업이 반복될 수 있습니다. 반복적인 코드를 쉽게 사용하기 위해서는 그것을 담는 메소드를 만들어 두는 것이 좋습니다. 이것이 바로 코드 재활용의 예라고 말씀드릴 수 있습니다.

readContentFrom 메소드가 예외 처리를 하지 않는 이유

그런데 이 메소드는 예외 처리를 직접 하지 않고 던집니다. 이 예에서는 그 메소드를 호출하는 main 메소드가 대신 처리해야 합니다. 그렇게 구현한 이유가 있습니다.

예외가 발생하면, 그것을 사용자에게 화면으로 알려줘야 합니다. 파일이 없어 사용자가 요청한 것을 처리할 수 없음을 보여주는 것이 그 중 하나이지요. 이러한 경우 예외 처리 코드는 UI와 관계됩니다. 사용자에게 보여줘야 하기 때문이니까요.

만약 readContentFrom 메소드가 예외 처리를 직접 한다면, 사용자에게 예외를 알리는 코드를 그 안에 작성해야 합니다. 그렇게 되면 이 메소드는 특정한 UI 환경에서만 사용이 가능합니다. 안드로이드 앱의 경우라면, 이 메소드는 PC 환경에서는 사용될 수 없습니다. 이것은 코드를 재활용할 수 있는 범위를 제한하는 것입니다. 모든 환경에서 readContentFrom 메소드를 사용하기 위해서는 그것이 예외 처리를 직접 하지 않는 것이 더 좋습니다.

위 사례와 같이 한 메소드가 예외 처리를 직접 하는 것이 좋은지 아닌지는 프로그래밍할 때 면밀히 고려하시고 결정해야 합니다. 프로그램은 처음에 잘 만들어야 나중에 편합니다.

Toplist

최신 우편물

태그