Java에서 파일 닫기

Rupam Yadav 2024년2월15일
  1. 자바에서 ’try-with-resources’를 사용하여 파일 닫기 (7+)
  2. ‘close()’ 메서드를 사용하여 자바에서 파일 닫기
  3. 결론
Java에서 파일 닫기

자바 프로그래밍에서 파일 처리는 기본적인 작업이며, 적절한 리소스 관리가 필수적입니다. 과거에는 파일을 닫기 위해 finally 블록이나 ‘close()’ 메서드를 수동으로 사용해야 했으며, 이는 오류를 발생시킬 수 있고 리소스 누수로 이어질 수 있었습니다.

그러나 자바 7에서 도입된 try-with-resources와 ‘close()’ 메서드의 지속적인 사용으로 인해 파일 관리가 더욱 효율적이고 오류 발생 가능성이 줄었습니다.

이 글에서는 ’try-with-resources’와 ‘close()’ 메서드를 사용하여 자바에서 파일을 효과적으로 닫는 방법에 대해 알아보겠습니다. 각 메서드에 대한 구문을 설명하고, 각 메서드에 대한 실제 예제를 제공하며, 파일 작업시 리소스 관리의 중요성을 강조할 것입니다.

자바에서 ’try-with-resources’를 사용하여 파일 닫기 (7+)

Java 7 이전에는 개발자들이 ‘finally’ 블록을 사용하여 파일을 수동으로 닫아야 했으며, 이는 오류를 발생시키고 리소스 누수를 야기할 수 있었습니다. 그러나 Java 7에서 도입된 ’try-with-resources’를 통해 파일 처리가 더욱 효율적이고 오류 발생 가능성이 줄었습니다.

’try-with-resources’는 자바 7에서 도입된 언어 기능으로, 리소스 관리를 간소화하는 역할을 합니다. ’try’ 블록의 끝에서 리소스(파일 입력 및 출력 클래스, BufferedReader 또는 BufferedWriter와 같은 파일 관련 클래스)의 닫기를 자동으로 관리합니다. ’try-with-resources’와 파일을 사용하는 구문은 간단합니다:

try (ResourceType resource = new ResourceType()) {
  // Use the resource here
} catch (Exception e) {
  // Handle exceptions if necessary
}
// Resource is automatically closed when exiting this block

다음은 파일을 닫기 위해 ’try-with-resources’를 사용하는 방법의 예입니다:

  1. 리소스 초기화: ’try’ 키워드 뒤의 괄호 안에서 리소스(예: ‘FileInputStream’, ‘FileOutputStream’, ‘BufferedReader’ 또는 ‘BufferedWriter’와 같은 파일 관련 클래스)를 선언하고 초기화합니다. 리소스는 ‘AutoCloseable’ 인터페이스나 ‘Closeable’과 같은 하위 인터페이스를 구현해야 합니다.
  2. 리소스 사용: ’try’ 블록 내부에서 읽기, 쓰기 또는 기타 작업에 필요한 리소스를 사용합니다. 코드에서 리소스를 명시적으로 닫을 필요가 없습니다.
  3. 리소스 닫기: ’try’ 블록을 벗어나는 경우, 정상적으로 완료되었든 예외가 발생했든 상관없이 리소스가 자동으로 닫힙니다. 닫힘을 보장하기 위해 ‘finally’ 블록을 작성할 필요가 없습니다.

실용적인 예제

자바에서 데이터를 파일로부터 읽어오는 실용적인 예제로 ’try-with-resources’가 어떻게 작동하는지 알아보겠습니다:

import java.io.FileInputStream;
import java.io.IOException;

public class FileReadExample {
  public static void main(String[] args) {
    try (FileInputStream fis = new FileInputStream("example.txt")) {
      int data;
      while ((data = fis.read()) != -1) {
        System.out.print((char) data);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    // The FileInputStream is automatically closed
  }
}

이 예제에서는 ’try’ 블록 내부에서 ‘FileInputStream’을 사용하여 파일을 열고 내용을 읽습니다. 블록이 정상적으로 완료되었든 예외가 발생했든지 여부에 상관없이 ‘FileInputStream’이 자동으로 닫혀 시스템 리소스가 해제됩니다.

예외 처리

’try-with-resources’는 예외 처리를 간소화합니다. ’try’ 블록 내에서 예외가 발생하면 리소스가 예외가 호출스택을 타고 올라가기 전에 자동으로 닫힙니다. 필요에 따라 ‘catch’ 블록에서 예외를 잡고 처리할 수 있습니다.

import java.io.FileOutputStream;
import java.io.IOException;

public class FileWriteExample {
  public static void main(String[] args) {
    try (FileOutputStream fos = new FileOutputStream("output.txt")) {
      // Write data to the file
      fos.write("Hello, World!".getBytes());
    } catch (IOException e) {
      e.printStackTrace();
    }
    // The FileOutputStream is automatically closed
  }
}

‘close()’ 메서드를 사용하여 자바에서 파일 닫기

다음 프로그램에서는 ‘BufferedWriter’ 클래스를 사용합니다. 이 클래스를 사용하면 배열, 문자열 및 문자를 문자 출력 스트림에 효율적으로 작성할 수 있습니다.

또한 문자 스트림을 작성하기 위해 ‘FileWriter’ 클래스와 ‘BufferedWriter’ 클래스를 사용합니다.

파일 경로는 ‘File’ 클래스 파일의 인스턴스로 나타냅니다. 지정된 경로명의 추상 경로명이 생성됩니다.

‘BufferedWriter’의 ‘write()’ 메서드를 사용하여 텍스트를 파일에 저장합니다. ’newLine()’ 메서드는 줄 구분자로 ‘/n’을 추가합니다.

대부분의 스트림은 사용 후에 닫을 필요가 없습니다. 입력/출력 채널이 소스인 경우 스트림을 닫는 것이 좋습니다.

프로그램 종료 또는 파일 작업을 실행하기 전에 close() 메소드를 호출해야 합니다. 그렇지 않으면 일부 데이터를 잃을 수 있습니다.

따라서 스트림을 닫고 데이터를 보호하기 위해 close() 메소드를 사용합니다.

스트림에는 BaseStream.close()라는 메소드가 있으며, Autoclosable을 구현합니다. 대부분의 스트림 인스턴스는 추가적인 리소스 관리가 필요하지 않은 배열인 컬렉션에 의해 지원되므로 닫을 필요가 없습니다.

소스가 IO 채널인 경우 스트림을 닫아야 합니다.

다음은 쓰기 작업을 수행하기 전의 파일 내용입니다.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class CloseFile {
  public static void main(String[] args) throws Exception {
    File file = new File("/Users/John/Temp/demo1.txt");
    if (file.exists()) {
      BufferedWriter bufferWriter = new BufferedWriter(new FileWriter(file, true));
      bufferWriter.write("New Text");
      bufferWriter.newLine();
      bufferWriter.close();
    }
  }
}

파일 작성 작업 전 파일 내용

쓰기 작업을 수행한 후 파일 내용이 변경되었습니다.

쓰기 작업 수행

결론

이 글에서는 try-with-resourcesclose() 메서드를 사용하여 파일을 닫는 방법을 읽기 및 쓰기 작업 모두에 대해 어떻게 사용하는지, 그리고 각 접근 방식이 예외 처리를 간단하게 어떻게 만드는지를 보여주었습니다.

이러한 방법들은 파일 및 기타 리소스를 닫는 현대 자바 프로그래밍의 모범 사례로 간주되며, 효율적이고 신뢰할 수 있는 리소스 관리를 보장합니다.

작가: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

관련 문장 - Java File