Try with resources는 파일을 사용하고 자원을 해제할 때, 명시적으로 해제하지 않아도 자동으로 해제해줍니다. 이 방식은 파일을 읽을 때 자원 해제 코드를 따로 구현해줄 필요가 없어서 자주 사용하고 있습니다.

이 글에서 try-with-resources 구문을 사용하는 이유와, 여러 파일을 동시에 사용하는 방법에 대해서 알아보겠습니다.

1. try-with-resources가 없을 때 발생하는 일

만약 try-with-resources를 사용하지 않으면, 아래 예제처럼 try-catch-finally 구분을 사용하여 파일을 열고 닫아야 합니다.

  • BufferedReader로 파일 열었으면, 꼭 닫아줘야 함
  • 일반적으로 try에서 파일을 열면 finally 구문에서 close()를 호출하여 파일을 닫음
  • 파일을 닫을 때 try-catch로 IOException의 예외 처리를 추가해야해서 코드가 길어짐, 또한 실수로 파일 닫는 것을 잊어먹을 수 있음
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Example {

    public static void main(String[] args) {
        String filePath = "sample.txt";
        BufferedReader bufferedReader = null;

        try {
            // 파일 열기
            FileReader fileReader = new FileReader(filePath);
            bufferedReader = new BufferedReader(fileReader);

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 파일 닫기
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2. try-with-resources로 파일 1개 열기

다음과 같이 try-with-resources를 사용하여 위의 예제를 다시 구현해보았습니다.

try-with-resources의 구문이 끝날 때, try(..)에서 열은 파일은 자동으로 닫히기 때문에 finally 블록에서 추가로 파일을 닫는 코드를 구현할 필요가 없습니다.

  • try(....) 안에서 열은 파일은 try 구문이 종료될 때 자동 해제 됨
  • try(....) 안에서 여러 줄로 코드를 작성할 때는 ;로 코드를 구분해야 함. 마지막 라인에는 ;를 입력하지 않음
  • 주의 : try { } 안에서 열은 파일은 try 구문이 종료될 때 해제 안됨, 꼭 try (...)에서 열어야 함
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Example {

    public static void main(String[] args) {

        String filePath = "sample.txt";
        try (
                // 파일을 열고 BufferedReader로 읽기
                FileReader fileReader = new FileReader(filePath);
                BufferedReader bufferedReader = new BufferedReader(fileReader)
        ) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. try-with-resources로 파일 2개 열기

아래 예제는 try-with-resources에서 두개의 파일을 여는 예제입니다. 동일한 방식으로 2개 이상의 파일을 열 수 있습니다. try 구문이 종료되면 여기서 열은 파일들은 자동으로 닫힙니다.

  • try (...)에서 여러 파일을 열 수 있음
  • 예제는 sample.txt 파일을 읽고 output.txt 파일에 같은 내용을 write
  • try 구문 종료 시, try에서 열은 2개의 파일은 자동으로 닫힘
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Example {

    public static void main(String[] args) {
        String inputFilePath = "sample.txt";
        String outputFilePath = "output.txt";

        try (
                // 입력 파일을 열고 BufferedReader로 읽기
                FileReader fileReader = new FileReader(inputFilePath);
                BufferedReader bufferedReader = new BufferedReader(fileReader);

                // 출력 파일을 열고 BufferedWriter로 쓰기
                FileWriter fileWriter = new FileWriter(outputFilePath);
                BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)
        ) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                // 읽은 데이터를 출력 파일에 쓰기
                bufferedWriter.write(line);
                bufferedWriter.newLine();
            }
            System.out.println("File copy completed.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}