[Java] Try with resources로 여러 파일 열기/닫기
June 30, 2024
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();
        }
    }
}