Java예외와 입출력

NIO Path, Files, 디렉터리 작업

현대 Java 파일 I/O의 핵심인 `Path`와 `Files`를 사용해 경로 조합, 파일 읽기/쓰기, 디렉터리 작업을 어떻게 읽어야 하는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

java
Path path = Path.of("data", "users.txt");

if (Files.exists(path)) {
    List<String> lines = Files.readAllLines(path);
}

설명

  • 과거 Java에서는 File 중심 API를 많이 봤지만, 현대 Java 파일 I/O의 중심은 java.nio.file 패키지입니다. 여기서 Path가 경로 표현을 맡고, Files가 실제 파일 작업을 담당합니다.
  • Path는 파일 시스템 경로를 조합하고, 부모/자식 관계를 계산하고, 상대 경로와 절대 경로를 다루는 값 객체에 가깝습니다. resolve, relativize, normalize 같은 메서드를 보면 역할이 분명합니다.
  • Files는 읽기/쓰기, 존재 여부 확인, 복사, 이동, 디렉터리 생성, 디렉터리 순회처럼 실제 작업을 모아 둔 유틸리티 클래스입니다. 즉 "경로를 표현하는 것"과 "경로에 대해 작업하는 것"이 분리됩니다.
  • 이 분리는 단순한 API 정리 이상의 의미가 있습니다. 파일 경로를 값처럼 다루고, 실제 I/O는 예외와 함께 별도 단계에서 수행하게 해 주기 때문에 코드 구조가 훨씬 읽기 쉬워집니다.
  • 실무에서는 설정 파일 읽기, 업로드 경로 생성, 배치 파일 처리, 로그 파일 탐색에서 거의 매번 이 API를 다시 보게 됩니다. 그래서 File보다 Path/Files 감각을 먼저 잡는 편이 좋습니다.

빠른 정리

요소역할
Path경로 표현
Path.of(...)경로 생성
Files.exists(path)존재 여부 확인
Files.readAllLines(path)파일 전체 줄 읽기
Files.createDirectories(path)디렉터리 생성

주의할 점

경로를 문자열 덧셈으로 직접 만들기 시작하면 운영체제별 구분자와 상대 경로 문제가 쉽게 섞입니다. 경로 자체는 Path로 만들고, 실제 파일 작업은 Files로 분리하는 습관이 더 안전합니다.

참고 링크

3 sources