Files.walk로 디렉터리 트리 순회
Files.walk로 파일을 재귀적으로 나열하고 확장자로 필터링하며 디렉터리 크기를 계산합니다.
Files.walk로 디렉터리 트리 순회은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Files.walk 개요
Files.walk(startPath)는 지정된 경로에서 시작하여 모든 파일과 디렉터리를 재귀적으로 나열하는 지연 방식의 Stream<Path>을 반환합니다. 깊이 우선으로 순회하며 시작 경로 자체도 포함합니다.
import java.nio.file.*;
import java.util.stream.*;
try (Stream<Path> stream = Files.walk(Path.of("/home/user/projects"))) {
stream.forEach(System.out::println);
} // stream and underlying resources closed automatically깊이 제한
깊은 재귀를 방지하려면 최대 깊이를 지정하세요:
Path root = Path.of("/home/user/projects");
// Only immediate children (depth 1)
try (var stream = Files.walk(root, 1)) {
stream.filter(p -> !p.equals(root)) // exclude start path
.forEach(System.out::println);
}파일 형식으로 필터링
Files.isRegularFile() 또는 Files.isDirectory()와 결합하여 필터링할 수 있습니다:
Path root = Path.of(".");
try (var stream = Files.walk(root)) {
long fileCount = stream
.filter(Files::isRegularFile)
.count();
System.out.println("Files: " + fileCount);
}확장자로 필터링
특정 확장자를 가진 모든 파일을 찾아 보세요:
try (var stream = Files.walk(Path.of("/src"))) {
List<Path> javaFiles = stream
.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".java"))
.collect(Collectors.toList());
javaFiles.forEach(System.out::println);
}디렉터리 크기 계산
디렉터리 아래에 있는 모든 파일의 크기를 합산해 보세요:
try (var stream = Files.walk(Path.of("/home/user/data"))) {
long totalBytes = stream
.filter(Files::isRegularFile)
.mapToLong(p -> {
try { return Files.size(p); }
catch (IOException e) { return 0; }
})
.sum();
System.out.printf("Total: %.2f MB%n", totalBytes / 1_048_576.0);
}Files.list와 Files.walk
Files.list(dir)는 ls처럼 하나의 디렉터리에 있는 바로 아래 내용만 나열합니다. Files.walk는 하위 디렉터리까지 재귀적으로 탐색합니다.
// Only immediate children:
try (var stream = Files.list(Path.of("/home/user"))) {
stream.forEach(System.out::println);
}속성 기반 검색에 Files.find 사용
Files.find(root, depth, matcher)는 파일 속성을 기준으로 일치 항목을 찾을 때 walk와 filter를 조합하는 것보다 효율적입니다:
import java.nio.file.attribute.BasicFileAttributes;
try (var stream = Files.find(
Path.of("/home/user"),
Integer.MAX_VALUE,
(p, attrs) -> attrs.isRegularFile() && attrs.size() > 1_000_000
)) {
stream.forEach(p -> System.out.println("Large file: " + p));
}디렉터리 트리 삭제
walk와 sorted(reversed)를 사용하여 디렉터리와 모든 내용을 삭제할 수 있습니다(가장 깊은 파일부터 삭제):
Path toDelete = Path.of("/tmp/workdir");
try (var stream = Files.walk(toDelete)) {
stream.sorted(Comparator.reverseOrder())
.forEach(p -> {
try { Files.delete(p); }
catch (IOException e) { e.printStackTrace(); }
});
}디렉터리 트리 복사
원본 트리를 순회하면서 디렉터리 구조를 유지한 채 각 파일을 복사합니다:
Path src = Path.of("/source"), dst = Path.of("/destination");
try (var stream = Files.walk(src)) {
stream.forEach(p -> {
try {
Path target = dst.resolve(src.relativize(p));
if (Files.isDirectory(p)) Files.createDirectories(target);
else Files.copy(p, target, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) { throw new RuntimeException(e); }
});
}접근할 수 없는 파일 처리
Files.walk는 읽을 수 없는 디렉터리를 만나면 IOException을 발생시킵니다. FileVisitOption.FOLLOW_LINKS는 주의해서 사용하세요. 심볼릭 링크 순환으로 인해 무한 재귀가 발생할 수 있습니다.
try (var stream = Files.walk(Path.of("/"),
FileVisitOption.FOLLOW_LINKS)) { // caution: symlink loops
// ...
} catch (IOException e) {
System.err.println("Access error: " + e.getMessage());
}walkFileTree: 이벤트 기반 순회
방문 전후 처리와 오류 처리 등을 더 세밀하게 제어하려면 FileVisitor와 함께 Files.walkFileTree()를 사용하세요:
Files.walkFileTree(Path.of("/home/user"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println("File: " + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
System.out.println("Dir: " + dir);
return FileVisitResult.CONTINUE;
}
});빠른 확인
디렉터리의 바로 아래 자식 항목만 재귀 없이 나열하려면 어떤 Files 메서드를 사용해야 하나요?
복습: Files.walk
핵심 내용:
- Files.walk(root) — 모든 경로를 포함하는 재귀적 지연 Stream
- 스트림을 닫으려면 항상 try-with-resources를 사용하세요
- Files.isRegularFile/isDirectory로 필터링하고 endsWith로 확장자를 기준으로 필터링합니다
- Files.list(dir) — 바로 아래 자식 항목만 나열합니다
- Files.find — 효율적인 속성 기반 검색입니다
- walkFileTree — 방문 전후 콜백을 사용하는 이벤트 기반 순회입니다
자주 묻는 질문
“Files.walk로 디렉터리 트리 순회” 강의는 무료인가요?
네 — “Files.walk로 디렉터리 트리 순회” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Files.walk로 디렉터리 트리 순회”에서 뭘 배우나요?
Files.walk로 파일을 재귀적으로 나열하고 확장자로 필터링하며 디렉터리 크기를 계산합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“Files.walk로 디렉터리 트리 순회” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Path: 파일 위치 표현
- Files 유틸리티: 읽기, 쓰기, 복사, 이동
- Files.walk로 디렉터리 트리 순회
- WatchService: 파일 변경 모니터링