Java 파일 입출력 기초

Java에서 파일을 다루는 기본적인 방법을 살펴봅니다.

임시 파일 생성

유니크한 이름을 가진 임시 파일을 생성할 수 있습니다.

File.createTempFile()

File tempFile = File.createTempFile("prefix-", ".zip");
// 결과: prefix-12312124.zip (유니크한 숫자가 자동으로 붙음)

특징:

  • 시스템 임시 디렉토리에 생성됨
  • 파일명에 유니크한 숫자가 자동 추가됨
  • 충돌 없이 안전하게 파일 생성

지정된 디렉토리에 생성

File directory = new File("/custom/temp/dir");
File tempFile = File.createTempFile("prefix-", ".zip", directory);

NIO.2 사용 (Java 7+)

import java.nio.file.Files;
import java.nio.file.Path;

// 임시 파일 생성
Path tempFile = Files.createTempFile("prefix", ".suffix");

// 임시 디렉토리 생성
Path tempDir = Files.createTempDirectory("prefix");

파일 자동 삭제

deleteOnExit()

JVM 종료 시 파일을 자동으로 삭제합니다.

File tempFile = File.createTempFile("temp", ".txt");
tempFile.deleteOnExit();

주의사항:

  • 정상 종료 시에만 동작
  • 강제 종료 시 삭제되지 않음
  • 많은 파일에 사용 시 메모리 문제 가능

try-with-resources로 파일 삭제

Path tempFile = Files.createTempFile("temp", ".txt");
try {
    // 파일 사용
    Files.write(tempFile, "content".getBytes());
    // ...
} finally {
    Files.deleteIfExists(tempFile);
}

기본 파일 작업 (NIO.2)

파일 읽기

// 전체 내용 읽기
String content = Files.readString(Path.of("file.txt"));

// 라인별 읽기
List<String> lines = Files.readAllLines(Path.of("file.txt"));

// 바이트 배열로 읽기
byte[] bytes = Files.readAllBytes(Path.of("file.bin"));

파일 쓰기

// 문자열 쓰기
Files.writeString(Path.of("file.txt"), "content");

// 라인 쓰기
List<String> lines = Arrays.asList("line1", "line2");
Files.write(Path.of("file.txt"), lines);

// 바이트 쓰기
Files.write(Path.of("file.bin"), byteArray);

파일 복사/이동

// 복사
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);

// 이동
Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);

파일 정보 확인

Path path = Path.of("file.txt");

boolean exists = Files.exists(path);
boolean isDirectory = Files.isDirectory(path);
boolean isRegularFile = Files.isRegularFile(path);
long size = Files.size(path);
FileTime lastModified = Files.getLastModifiedTime(path);

디렉토리 작업

// 디렉토리 생성
Files.createDirectory(Path.of("newDir"));

// 중첩 디렉토리 생성
Files.createDirectories(Path.of("parent/child/grandchild"));

// 디렉토리 내용 나열
try (Stream<Path> stream = Files.list(Path.of("dir"))) {
    stream.forEach(System.out::println);
}

// 재귀적으로 탐색
try (Stream<Path> stream = Files.walk(Path.of("dir"))) {
    stream.filter(Files::isRegularFile)
          .forEach(System.out::println);
}

정리

작업 권장 방법
임시 파일 Files.createTempFile()
파일 읽기 Files.readString(), Files.readAllLines()
파일 쓰기 Files.writeString(), Files.write()
파일 복사 Files.copy()
파일 이동 Files.move()

Java 7 이상에서는 NIO.2 (java.nio.file) 패키지를 사용하는 것이 권장됩니다. 더 직관적이고 강력한 API를 제공합니다.