| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 가비지컬렉션
- 자바개발
- 자바프로그래밍
- 백준
- 객체지향
- HashMap
- 자바공부
- 자바
- 파이썬
- 개발자취업
- 프로그래머스
- 예외처리
- 자료구조
- 코딩인터뷰
- 클린코드
- 코딩테스트
- 개발공부
- JVM
- 코딩공부
- 코딩테스트준비
- 알고리즘공부
- 개발자팁
- 코딩테스트팁
- 알고리즘
- Java
- 메모리관리
- 자바기초
- 프로그래밍기초
- 정렬
- 멀티스레드
- Today
- Total
코드 한 줄의 기록
자바 파일 및 디렉터리 완벽 가이드: Path와 Files로 배우는 실전 활용법 본문
프로젝트를 진행할 때 파일을 생성하거나, 디렉터리 내 파일을 탐색하거나, 복사·삭제·이동하는 작업이 생각보다 자주 필요하다. 과거에는 File 클래스를 많이 썼지만, 자바 7에서 새로 도입된 NIO.2(java.nio.file) 덕분에 파일 시스템을 더 직관적이고 강력하게 다룰 수 있게 되었다. 필자 역시 현업에서 자바 파일 입출력이 필수라 느껴 NIO.2의 Path와 Files를 심도있게 공부했고, 실제 사용법과 예제를 한 번에 정리한 이 글을 통해 여러분도 실전에서 곧바로 써먹을 수 있게 도와주고자 한다.
NIO.2의 등장 배경과 기존 File 클래스 한계
기존의 java.io.File은 기능이 제한적이고, 예외 처리나 성능, 플랫폼 독립성 면에서 아쉬움이 많았다. 대표적으로는 다음과 같은 문제점이 있다.
- 심볼릭 링크/하드 링크 제대로 지원 안됨
- 읽기/쓰기 권한 구분 애매함
- 예외 처리가 상세하지 않음(Exception, IOException만 던짐)
- 대용량, 대용량 디렉터리 트리 처리시 속도가 느릴 수 있음
- 기본적인 파일 복사, 이동도 직접 구현해야 하고 불편함
이런 문제를 해소하며 현업 프로그래머와 운영환경에서 바로 통하는 현대적인 파일 작업 API가 NIO.2이다.
NIO.2의 핵심 클래스: Path와 Files 완전정복
Path란 무엇이며 어떻게 쓰나?
NIO.2의 모든 파일과 디렉터리 작업의 출발점이자 핵심은 바로 java.nio.file.Path이다. Path는 운영체제별 파일 시스템 경로를 추상화한 인터페이스이다.
Path path = Paths.get("D:/test/sample.txt");
Paths.get() 메서드를 사용해 바로 Path 객체 생성!
Path의 주요 메서드들은 다음과 같다.
- getFileName(): 파일명만 가져옴
- getParent(): 상위 디렉토리 경로
- getRoot(): D:/, / 와 같은 루트 경로
- resolve(): 하위 경로 결합
- relativize(): 두 경로 상대 경로 반환
- toAbsolutePath(): 절대 경로 반환
Path base = Paths.get("/data/java");
Path file = base.resolve("nio2-guide.txt"); // /data/java/nio2-guide.txt
Files 파일과 디렉터리, 입출력, 속성까지 모두 다룬다
NIO.2에서 실질적인 파일 및 디렉터리 입출력, 관리 작업은 java.nio.file.Files의 정적 메서드로 이뤄진다.
대표 메소드 및 특징:
- 파일 생성/삭제/복사/이동: createFile, delete, copy, move
- 파일 존재 확인: exists, notExists
- 디렉터리 작업: createDirectory, createDirectories, list, walk
- 스트림과 연동: readAllBytes, readAllLines, newBufferedReader, newBufferedWriter
- 파일 속성 조회/설정: isDirectory, isRegularFile, size, getLastModifiedTime, setAttribute
- 유연한 예외 처리
- 콜백·lambda와 잘 어울린다
실전 예제: File에서 NIO.2로 마이그레이션
아래 코드는 자주 쓰는 파일/폴더 작업별 NIO.2 방식 예시다.
파일 생성 및 쓰기
Path path = Paths.get("output.txt");
String content = "NIO.2 파일 생성 및 쓰기 예제";
Files.write(path, content.getBytes());
파일 읽기
Path path = Paths.get("output.txt");
String data = Files.readString(path); // Java 11+
디렉터리 생성, 폴더 전체 만들기
// 중첩된 디렉터리도 한 번에 생성
Path dir = Paths.get("parent/child/grandchild");
Files.createDirectories(dir);
파일 복사, 이동, 삭제
// 복사
Files.copy(Paths.get("test1.txt"), Paths.get("backup/test1.txt"));
// 이동
Files.move(Paths.get("test1.txt"), Paths.get("archive/test1.txt"));
// 삭제
Files.deleteIfExists(Paths.get("archive/test1.txt"));
디렉터리 내 파일 목록 조회 및 필터링
try (DirectoryStream<Path> stream =
Files.newDirectoryStream(Paths.get("."), "*.txt")) {
for (Path entry : stream) {
System.out.println(entry.getFileName());
}
}
파일 속성 읽기
Path path = Paths.get("output.txt");
System.out.println(Files.size(path)); // 파일 크기 (byte)
System.out.println(Files.getLastModifiedTime(path)); // 마지막 수정 시간
System.out.println(Files.isExecutable(path)); // 실행 권한 여부
디렉터리 내용 탐색 – Files.walk(), Files.list() 차이
- Files.list(Path) – 1단계 하위 경로만 반환(파일/디렉터리)
- Files.walk(Path) – 지정한 깊이까지 모든 하위 경로를 Stream으로 반환(재귀적으로 탐색)
예시: 모든 txt 파일 중에서 1MB를 넘는 파일만 찾아 출력
try (Stream<Path> stream = Files.walk(Paths.get("logs"), 5)) {
stream
.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".txt"))
.filter(p -> {
try {
return Files.size(p) > 1024 * 1024;
} catch (IOException e) {
return false;
}
})
.forEach(System.out::println);
}
예외 처리와 안전성 – try-with-resources 적극 활용!
입출력 스트림과 마찬가지로, NIO.2도 try-with-resources 구문을 사용하면 자원 해제를 안전하고 깔끔하게 처리할 수 있다.
실무에서 자주 쓰이는 활용법 정리
- 자주 실행하는 파일 이동·백업 스크립트 자바로 구현할 때
- 로그 파일 주기적 아카이빙 자동화
- 서버 내 특정 확장자 파일 일괄 검사 및 정리
- 대용량 파일을 빠르게 복사/이동/삭제해야 할 때
- 대규모 디렉터리(수천~수만 개 파일) 탐색 및 처리
이처럼 NIO.2 Path/Files를 제대로 익히면 자바 애플리케이션뿐 아니라 간단한 툴, 서버 스크립트 등 폭넓은 환경에서 생산성이 획기적으로 올라간다.
NIO.2로 작업할 때 주의할 점 및 고급 팁
- 상대/절대 경로 활용 익히기: Path는 상대, 절대 경로 모두 다루지만, 혼용할 때 버그 유의
- OS 종속적 경로(Windows vs UNIX) 처리: File.separator 대신 Path 활용
- 하드 링크/심볼릭 링크 등 고급 속성: Files.isSymbolicLink(), Files.readSymbolicLink() 등도 지원
- 원자적 파일 이동/복사 등 고급 옵션: StandardCopyOption.ATOMIC_MOVE 등 옵션 적극 활용
- DirectoryStream 등은 close 반드시 신경쓰기, try-with-resources 적극 사용
- 대용량/대규모 작업 시 Stream 활용하면 OOM 방지 및 병렬 처리(Parallel Stream)도 가능
자바 파일/디렉터리 입출력의 뉴노멀, NIO.2 Path & Files 적극 활용하자
자바 NIO.2의 Path와 Files는 기존 File 클래스를 완전히 대체하고 남을 만큼 강력하다.
여러분도 올드한 java.io.File의 불편함에서 벗어나, 위 함수들과 팁을 실무 코딩에 바로 적용해 보자!
필자 역시 NIO.2를 깊이 파악한 이후 파일 처리 속도가 크게 개선되고, 코드가 훨씬 깔끔해지는 것을 체감했다.
여러분도 지금 NIO.2를 제대로 익혀 두면, 앞으로의 자바 프로그래밍이 훨씬 더 폭넓고 견고해질 것이다.
Java Stream Collectors 완전 정복: groupingBy와 partitioningBy로 데이터 그룹화하기
Stream API를 공부하다 보면 중간 연산까지는 그럭저럭 이해가 되는데, 정작 최종 연산인 collect()에서 막히는 경우가 많다. 특히 Collectors 클래스의 다양한 메서드들은 처음 봤을 때 복잡해 보이지만
byteandbit.tistory.com
'JAVA' 카테고리의 다른 글
| Java I/O 완벽 가이드: 바이트와 문자 스트림의 차이를 정확히 이해하기 (0) | 2025.11.09 |
|---|---|
| Java 소켓과 HTTP 통신: 기초부터 클라이언트 구현까지 완벽 정리 (0) | 2025.11.08 |
| Java Stream Collectors 완전 정복: groupingBy와 partitioningBy로 데이터 그룹화하기 (0) | 2025.11.06 |
| Java Optional로 NPE를 잡아보자 - 실무 활용 가이드 (0) | 2025.11.05 |
| Java 스트림 API 완벽 정리: 중간연산·최종연산·파이프라인 총정리 (0) | 2025.11.01 |