Java에서 listFiles() 메서드는 현재 File 객체가 가리키는 경로에 존재하는 모든 파일과 디렉터리의 객체(추상 경로명)를 배열 형태로 반환합니다.
FileFilter 인터페이스는 경로 이름을 걸러 주는 필터 역할을 하며, 이를 listFiles() 메서드의 매개변수로 전달할 수 있습니다. 그러면 해당 메서드는 전달받은 필터 조건에 맞는 항목만 선별하여 결과를 반환합니다.
따라서 폴더 안의 파일만 목록으로 가져오고 싶다면, 파일만 통과시키는 FileFilter를 구현한 뒤 이를 listFiles() 메서드의 인자로 넘겨주면 됩니다.
다음은 예제에 사용된 ExampleDirectory의 내용입니다.

방법 1: FileFilter 인터페이스 활용
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
public class Demo {
public static void main(String args[]) throws IOException {
//디렉터리를 나타내는 File 객체 생성
File directoryPath = new File("D:\\ExampleDirectory");
//파일만 허용하는 필터 생성
FileFilter fileFilter = new FileFilter() {
public boolean accept(File dir) {
return dir.isFile();
}
};
File[] list = directoryPath.listFiles(fileFilter);
System.out.println("지정된 디렉터리의 파일 목록:");
for (File fileName : list) {
System.out.println(fileName);
}
}
}
실행 결과
지정된 디렉터리의 파일 목록: D:\ExampleDirectory\demo1.pdf D:\ExampleDirectory\demo2.pdf D:\ExampleDirectory\sample1.txt D:\ExampleDirectory\sample2.txt D:\ExampleDirectory\sample3.txt D:\ExampleDirectory\sample_jpeg1.jpg D:\ExampleDirectory\sample_jpeg2.jpg D:\ExampleDirectory\test1.docx D:\ExampleDirectory\test2.docx
참고: 람다 표현식으로 더 간결하게 작성하기
Java 8 이상에서는 위의 익명 클래스 대신 메서드 참조를 사용해 한 줄로 필터를 정의할 수 있습니다.
File[] files = directoryPath.listFiles(File::isFile);
방법 2: NIO의 Files.walk() 활용
Java 7부터 제공되는 NIO 패키지와 Java 8의 스트림 API를 함께 사용하면 더욱 간결하게 처리할 수 있습니다. Files.walk()로 디렉터리를 순회한 뒤, isRegularFile 조건을 통해 일반 파일만 걸러냅니다.
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::isRegularFile);
path.forEach(System.out::println);
}
}
실행 결과
D:\ExampleDirectory\demo1.pdf D:\ExampleDirectory\demo2.pdf D:\ExampleDirectory\sample1.txt D:\ExampleDirectory\sample2.txt D:\ExampleDirectory\sample3.txt D:\ExampleDirectory\sample_jpeg1.jpg D:\ExampleDirectory\sample_jpeg2.jpg D:\ExampleDirectory\test1.docx D:\ExampleDirectory\test2.docx
두 방법의 차이점
listFiles()는 지정한 디렉터리의 바로 아래 항목만 조회하는 반면, Files.walk()는 하위 디렉터리까지 재귀적으로 순회한다는 점이 다릅니다. 단순히 최상위 수준의 파일만 필요하다면 FileFilter 방식을, 중첩된 디렉터리 구조 전체를 탐색해야 한다면 Files.walk() 방식을 선택하는 것이 좋습니다.