Java에서 특정 폴더 안에 있는 디렉토리(폴더)만 골라서 가져오고 싶다면 어떻게 해야 할까요? 이 글에서는 listFiles() 메서드와 FileFilter 인터페이스를 활용하는 방법, 그리고 NIO API의 Files.walk()를 이용하는 방법까지 예제 코드와 함께 자세히 살펴봅니다.
핵심 개념 정리
listFiles() 메서드는 현재 File 객체가 나타내는 경로에 존재하는 모든 파일과 디렉토리의 객체(추상 경로)를 배열 형태로 반환합니다.
FileFilter 인터페이스는 경로 이름을 걸러내는 필터 역할을 하며, 이를 listFiles() 메서드의 매개변수로 전달할 수 있습니다. 이렇게 하면 전달된 필터 조건에 맞는 항목만 결과에 포함됩니다.
따라서 폴더 내의 디렉토리만 가져오려면 디렉토리만 허용하는 FileFilter를 구현한 뒤, 이를 listFiles() 메서드의 매개변수로 넘겨주면 됩니다.
아래는 예제에서 사용된 ExampleDirectory 폴더의 내용입니다.

방법 1: FileFilter를 활용한 디렉토리 조회
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
public class MyExample {
public static void main(String args[]) throws IOException {
// 디렉토리 경로에 대한 File 객체 생성
File directoryPath = new File("D:\\ExampleDirectory");
// 디렉토리만 통과시키는 필터 생성
FileFilter fileFilter = new FileFilter() {
public boolean accept(File dir) {
if (dir.isDirectory()) {
return true;
} else {
return false;
}
}
};
// 필터를 적용하여 목록 조회
File[] list = directoryPath.listFiles(fileFilter);
System.out.println("지정된 디렉토리의 폴더 목록:");
for (File fileName : list) {
System.out.println(fileName);
}
}
}
실행 결과
지정된 디렉토리의 폴더 목록: D:\ExampleDirectory\sample directory1 D:\ExampleDirectory\sample directory2 D:\ExampleDirectory\sample directory3 D:\ExampleDirectory\sample directory4
방법 2: 람다 표현식으로 더 간결하게 (Java 8 이상)
Java 8부터 도입된 람다 표현식과 메서드 참조를 사용하면 위의 익명 클래스 코드를 한 줄로 줄일 수 있습니다.
import java.io.File;
import java.io.IOException;
public class LambdaExample {
public static void main(String[] args) throws IOException {
File directoryPath = new File("D:\\ExampleDirectory");
// 메서드 참조를 활용한 간결한 필터링
File[] list = directoryPath.listFiles(File::isDirectory);
for (File fileName : list) {
System.out.println(fileName);
}
}
}
방법 3: NIO Files.walk()를 활용한 하위 디렉토리 탐색
java.nio.file 패키지의 Files.walk() 메서드를 사용하면 스트림(Stream) 기반으로 디렉토리를 순회하면서 손쉽게 필터링할 수 있습니다. 이 방법은 하위 폴더까지 재귀적으로 탐색한다는 점이 특징입니다.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ListOfFiles {
public static void main(String[] args) throws IOException {
Stream<Path> path = Files.walk(Paths.get("D:\\ExampleDirectory"));
path = path.filter(Files::isDirectory);
path.forEach(System.out::println);
}
}
실행 결과
D:\ExampleDirectory D:\ExampleDirectory\sample directory1 D:\ExampleDirectory\sample directory2 D:\ExampleDirectory\sample directory3 D:\ExampleDirectory\sample directory4
정리 및 팁
- 현재 폴더의 디렉토리만 필요하다면 →
listFiles(FileFilter)또는listFiles(File::isDirectory)를 사용하세요. - 하위 디렉토리까지 모두 탐색해야 한다면 →
Files.walk()와filter(Files::isDirectory)조합이 적합합니다. - 파일과 디렉토리가 많은 대형 폴더를 다룰 때는 스트림 기반의 NIO 방식이 성능과 가독성 면에서 유리할 수 있습니다.
- 실무에서는 try-with-resources 문법으로
Stream<Path>를 자동 종료(close)해 주는 것이 좋습니다.
상황에 맞는 방법을 선택하면 Java에서도 복잡한 파일 시스템 작업을 깔끔하고 효율적으로 처리할 수 있습니다.