Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 파일 확장자별로 디렉토리를 검색하는 방법

Java 프로그래밍을 하다 보면 특정 디렉토리 안에서 PDF, JPG, TXT 같은 특정 확장자를 가진 파일만 찾아야 하는 경우가 자주 발생합니다. 이 글에서는 Java의 Files.walk()FilenameFilter 두 가지 방법을 사용해 확장자별로 파일을 검색하는 방법을 예제와 함께 살펴보겠습니다.

방법 1: Files.walk()와 Stream API 활용하기

java.nio.file 패키지의 Files.walk() 메서드는 지정한 디렉토리와 그 하위 디렉토리까지 모두 순회하며 Path 스트림을 반환합니다. 여기에 filter()를 조합하면 원하는 확장자를 가진 파일만 손쉽게 추출할 수 있습니다.

다음 예제는 하나의 디렉토리에서 PDF, JPG, TXT, DOCX 파일을 각각 검색하여 출력합니다.

예제 코드

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 Demo {
    public static void main(String[] args) throws IOException {
        // PDF 파일 검색
        Stream<Path> path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        System.out.println("PDF 파일 목록:");
        path = path.filter(var -> var.toString().endsWith(".pdf"));
        path.forEach(System.out::println);

        // JPG 파일 검색
        path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        System.out.println("JPG 파일 목록:");
        path = path.filter(var -> var.toString().endsWith(".jpg"));
        path.forEach(System.out::println);

        // 텍스트 파일 검색
        path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        System.out.println("텍스트 파일 목록:");
        path = path.filter(var -> var.toString().endsWith(".txt"));
        path.forEach(System.out::println);

        // 워드 문서 검색
        path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        System.out.println("워드 파일 목록:");
        path = path.filter(var -> var.toString().endsWith(".docx"));
        path.forEach(System.out::println);
    }
}

실행 결과

PDF 파일 목록:
D:\ExampleDirectory\demo1.pdf
D:\ExampleDirectory\demo2.pdf
JPG 파일 목록:
D:\ExampleDirectory\sample_jpeg1.jpg
D:\ExampleDirectory\sample_jpeg2.jpg
텍스트 파일 목록:
D:\ExampleDirectory\sample1.txt
D:\ExampleDirectory\sample2.txt
D:\ExampleDirectory\sample3.txt
워드 파일 목록:
D:\ExampleDirectory\test1.docx
D:\ExampleDirectory\test2.docx

참고: Files.walk()가 반환하는 스트림은 한 번만 소비할 수 있기 때문에, 각 확장자마다 새로운 스트림을 생성해야 합니다. 또한 대소문자를 구분하지 않으려면 toLowerCase()를 적용한 뒤 비교하는 것이 좋습니다.

방법 2: FilenameFilter 인터페이스 활용하기

전통적인 java.io.File 기반 접근 방식도 유용합니다. FilenameFilter 인터페이스를 구현하면 list() 메서드 호출 시 필터 조건에 맞는 파일 이름만 배열로 받을 수 있습니다. 이 방식은 하위 디렉토리까지 탐색하지 않고 현재 디렉토리의 파일만 확인할 때 적합합니다.

다음 예제는 지정된 디렉토리에서 PDF 파일의 이름만 출력합니다.

예제 코드

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

public class MyExample {
    public static void main(String args[]) throws IOException {
        // 디렉토리 경로로 File 객체 생성
        File directoryPath = new File("D:\\ExampleDirectory");

        // PDF 파일용 필터 생성
        FilenameFilter pdfFileFilter = new FilenameFilter() {
            public boolean accept(File dir, String name) {
                String lowercaseName = name.toLowerCase();
                if (lowercaseName.endsWith(".pdf")) {
                    return true;
                } else {
                    return false;
                }
            }
        };

        String pdfFilesList[] = directoryPath.list(pdfFileFilter);
        System.out.println("지정된 디렉토리의 PDF 파일 목록:");
        for (String fileName : pdfFilesList) {
            System.out.println(fileName);
        }
    }
}

실행 결과

지정된 디렉토리의 PDF 파일 목록:
demo1.pdf
demo2.pdf

정리: 어떤 방법을 선택해야 할까?

  • Files.walk() + Stream: 하위 디렉토리까지 재귀적으로 탐색해야 할 때 가장 적합하며, 람다 표현식으로 간결하게 작성할 수 있습니다.
  • FilenameFilter: 현재 디렉토리의 파일만 대상으로 하며, 파일 이름 배열이 필요한 경우나 레거시 코드와의 호환성이 중요할 때 유용합니다.

두 방법 모두 실무에서 널리 사용되므로, 프로젝트의 요구 사항에 따라 적절히 선택하면 됩니다. 최신 Java 버전을 사용한다면 스트림 기반 방식이 더 읽기 쉽고 유연한 코드를 작성하는 데 도움이 됩니다.