0Pricing
Java Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Path: 파일 위치 표현
  2. Files 유틸리티: 읽기, 쓰기, 복사, 이동
  3. Files.walk로 디렉터리 트리 순회
  4. WatchService: 파일 변경 모니터링
← Java Academy(으)로 돌아가기