CodeGym /행동 /JAVA 25 SELF /임시 파일과 디렉터리 다루기

임시 파일과 디렉터리 다루기

JAVA 25 SELF
레벨 40 , 레슨 3
사용 가능

1. 임시 파일 생성: Files.createTempFile

임시 파일은 중간 데이터, 캐시, 혹은 장기 보관을 염두에 두지 않은 결과를 저장하는 데 사용됩니다. 보통 프로그램이 동작하는 동안이나 해당 데이터가 더 이상 필요 없을 때까지만 존재합니다.

주로 큰 문서를 다운로드할 때(먼저 임시 폴더에 저장한 뒤 원하는 위치로 이동), 다시 계산하거나 재수집할 수 있는 정보를 캐시할 때, 대용량 데이터를 처리하는 중간 결과를 저장할 때, 그리고 프로그램의 구성 요소나 스레드 간에 데이터를 교환할 때 사용됩니다. 또 하나의 흔한 시나리오는 테스트입니다. 작업 디렉터리를 어지르지 않도록 임시 파일에 기록하는 편이 더 편리합니다.

임시 파일은 프로그램을 위한 초안과 같습니다. 대외 공개용은 아니지만, 없으면 작업이 어려울 때가 많습니다.

Java에서는 이런 파일을 아주 간단히 — 말 그대로 한 줄로 — 만들 수 있습니다. 이를 위한 메서드가 Files.createTempFile 입니다.

간단한 예

import java.nio.file.*;

public class TempFileExample {
    public static void main(String[] args) throws Exception {
        // "myapp_" 접두사와 ".tmp" 접미사를 가진 임시 파일을 생성합니다
        Path tempFile = Files.createTempFile("myapp_", ".tmp");
        System.out.println("임시 파일이 생성되었습니다: " + tempFile);

        // 데이터를 쓸 수 있습니다
        Files.writeString(tempFile, "이것은 임시 데이터입니다");

        // 다시 읽어옵니다
        String data = Files.readString(tempFile);
        System.out.println("내용: " + data);
    }
}

어떻게 동작하나요?

  • 파일은 시스템 임시 디렉터리에 생성됩니다(보통 Linux에서는 "/tmp", Windows에서는 "C:\\Users\\<username>\\AppData\\Local\\Temp").
  • 파일 이름은 대략 "myapp_1234567890.tmp"처럼 만들어집니다.
  • 파일은 디스크에 실제로 존재하므로 일반 파일처럼 작업할 수 있습니다.

메서드 인수

  • 첫 번째 인수 — 접두사입니다(예: "myapp_").
  • 두 번째 인수 — 접미사입니다(예: ".tmp"). 지정하지 않으면 기본값은 ".tmp"입니다.
  • 두 인수 모두 null이면 기본 이름 규칙이 사용됩니다.

파일은 어디에 저장되나요?

기본적으로 시스템 임시 디렉터리에 저장됩니다. 하지만 직접 지정할 수도 있습니다:

Path tempDir = Paths.get("my_temp_folder");
Files.createDirectories(tempDir); // 없으면 생성
Path tempFile = Files.createTempFile(tempDir, "prefix_", ".txt");

2. 임시 디렉터리 생성: Files.createTempDirectory

때로는 임시 파일 하나가 아니라 임시 폴더 전체가 필요합니다 — 예를 들어 아카이브를 풀거나 여러 파일을 임시로 보관할 때입니다.

import java.nio.file.*;

public class TempDirExample {
    public static void main(String[] args) throws Exception {
        // "work_" 접두사의 임시 디렉터리를 생성합니다
        Path tempDir = Files.createTempDirectory("work_");
        System.out.println("임시 폴더: " + tempDir);

        // 그 안에 파일을 만들 수 있습니다
        Path fileInTempDir = Files.createTempFile(tempDir, "file_", ".dat");
        System.out.println("안의 임시 파일: " + fileInTempDir);
    }
}

특징:

  • 폴더 이름은 대략 "work_1234567890"처럼 만들어집니다.
  • 기본적으로 시스템 임시 디렉터리에 생성되지만, 원하는 다른 위치를 지정할 수도 있습니다.

디렉터리 지정

Path baseDir = Paths.get("my_temp_work");
Files.createDirectories(baseDir);
Path tempDir = Files.createTempDirectory(baseDir, "session_");

3. 임시 파일과 디렉터리 삭제

여기서 Java의 대표적인 주의점이 등장합니다: 임시 파일과 폴더는 자동으로 삭제되지 않습니다! 직접 지우지 않으면 디스크에 남아 오랫동안(혹은 시스템 정리까지) 자리를 차지하게 됩니다.

임시 파일은 어떻게 삭제하나요?

  • 수동으로: 파일 사용을 마친 후 Files.delete(...) 또는 Files.deleteIfExists(...)를 호출하세요.
  • 프로그램 종료 시: 오래된 방식의 File.deleteOnExit()를 사용할 수 있지만, 이는 Path가 아니라 File 객체에만 적용됩니다.

예: 임시 파일 삭제

import java.nio.file.*;

public class TempFileDeleteExample {
    public static void main(String[] args) throws Exception {
        Path tempFile = Files.createTempFile("demo_", ".tmp");
        System.out.println("생성됨: " + tempFile);

        // ... 파일을 사용합니다

        // 파일 삭제
        Files.deleteIfExists(tempFile);
        System.out.println("삭제됨: " + tempFile);
    }
}

deleteOnExit() 사용

import java.io.File;

public class DeleteOnExitDemo {
    public static void main(String[] args) throws Exception {
        File tempFile = File.createTempFile("legacy_", ".tmp");
        System.out.println("생성됨: " + tempFile);

        // JVM 종료 시 삭제하도록 표시합니다
        tempFile.deleteOnExit();
    }
}

주의!
메서드 deleteOnExit()Path가 아니라 File에서만 동작합니다. 최신 API(PathFiles)를 사용한다면 수동으로 삭제하세요.

임시 디렉터리 삭제

임시 폴더는 비어 있을 때만 삭제할 수 있습니다:

Files.delete(tempDir); // 내부에 무언가 남아 있으면 예외를 던집니다

폴더에 파일이 있으면 먼저 파일을 삭제한 뒤 폴더를 지우세요. 보통 이를 위해 간단한 재귀 메서드를 작성합니다.

4. 실무 팁

임시 파일은 어디에 보관할까요?

시스템 임시 디렉터리:
특별한 요구 사항이 없다면 기본값을 사용하세요. 경로는 다음과 같이 구할 수 있습니다:

String tempDir = System.getProperty("java.io.tmpdir");
System.out.println("시스템 임시 폴더: " + tempDir);

자체 폴더:
보안이나 구성상 필요하다면(예: 애플리케이션 디렉터리 내부) 별도의 폴더를 만들어 사용하세요.

보안

  • 임시 파일을 공개 폴더에 저장하지 마세요 — 특히 민감한 내용이 있을 수 있다면 더욱 그렇습니다.
  • 사용 후 임시 파일을 정리하세요 — 그렇지 않으면 누적되어 공간을 차지할 수 있습니다.

오류 발생 시 정리

프로그램 실행 중 오류가 발생해도 임시 파일을 반드시 삭제해야 합니다. 이를 위해 try-finally 블록을 사용하면 편리합니다:

Path tempFile = Files.createTempFile("task_", ".tmp");
try {
    // 파일을 사용합니다
} finally {
    Files.deleteIfExists(tempFile);
}

임시 파일과 테스트

테스트에서는 데이터 격리를 위해 임시 파일과 폴더를 자주 사용합니다. 테스트 후에는 생성한 모든 것을 반드시 삭제하세요!

5. 예: 데이터 처리를 위한 임시 작업 디렉터리

예를 들어, 아카이브를 처리하면서 파일을 임시로 풀어야 하는 프로그램을 작성한다고 가정해 봅시다. 이때 임시 폴더를 만들고, 작업이 끝나면 해당 폴더를 삭제하는 방식이 편리합니다.

import java.nio.file.*;
import java.io.IOException;

public class TempWorkDirExample {
    public static void main(String[] args) throws IOException {
        // 임시 디렉터리를 생성합니다
        Path tempWorkDir = Files.createTempDirectory("unzip_");
        System.out.println("임시 작업 폴더: " + tempWorkDir);

        try {
            // 여기에서 아카이브를 풀 수 있습니다
            Path tempFile = Files.createTempFile(tempWorkDir, "file_", ".txt");
            Files.writeString(tempFile, "처리를 위한 임시 데이터");

            // ... 파일을 처리합니다

        } finally {
            // 폴더의 모든 파일과 폴더 자체를 삭제합니다
            Files.walk(tempWorkDir)
                .sorted((a, b) -> b.compareTo(a)) // 먼저 파일, 그다음 폴더
                .forEach(path -> {
                    try {
                        Files.deleteIfExists(path);
                    } catch (IOException ex) {
                        System.err.println("삭제하지 못했습니다 " + path + ": " + ex.getMessage());
                    }
                });
            System.out.println("임시 폴더와 파일이 삭제되었습니다.");
        }
    }
}

참고:
먼저 모든 파일을 삭제한 다음 폴더를 삭제해야 합니다. 폴더 내용보다 폴더를 먼저 지우려고 하지 않도록 정렬이 필요합니다.

6. 임시 파일 작업 시 흔한 실수

오류 №1: 임시 파일이나 폴더 삭제를 잊음. 가장 흔한 문제는 임시 파일이 디스크에 남아 누적되면서 시간이 지날수록 시스템을 어지럽히는 것입니다. 특히 서버 애플리케이션이나 장시간 실행되는 프로세스에서는 치명적일 수 있습니다.

오류 №2: Path에 대해 deleteOnExit()를 사용함. 메서드 deleteOnExit()Path가 아니라 File 클래스에서만 동작합니다. 최신 API를 사용한다면 수동으로 삭제해야 합니다.

오류 №3: Files.delete로 비어 있지 않은 폴더를 삭제하려 함. Files.delete()는 비어 있는 디렉터리만 삭제합니다. 내부에 무언가 남아 있으면 예외가 발생합니다. 비어 있지 않은 디렉터리를 삭제하려면 재귀적으로 모든 파일을 삭제하세요.

오류 №4: 프로젝트 작업 디렉터리에 임시 파일을 생성함. 이는 중요한 파일을 실수로 삭제하거나 혼란을 야기할 수 있습니다. 시스템 임시 폴더나 애플리케이션 전용 임시 폴더를 사용하는 것이 좋습니다.

오류 №5: 임시 파일 삭제 시 발생하는 예외를 처리하지 않음. 파일이 이미 삭제되었거나 잠겨 있으면 삭제 시도가 예외를 유발할 수 있습니다. Files.deleteIfExists()와 적절한 오류 처리를 사용하세요.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION