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

Java에서 디렉토리 내 JPG 파일 목록을 가져오는 방법

개요

Java 프로그래밍을 하다 보면 특정 디렉터리에 있는 이미지 파일(jpg)만 골라서 목록을 가져와야 하는 경우가 자주 있습니다. 가장 기본적인 방법은 File 클래스의 String[] list(FilenameFilter filter) 메서드를 사용하는 것이며, Java 8 이상에서는 NIO(Files.walk)를 활용한 방법도 널리 쓰입니다.

방법 1: FilenameFilter 인터페이스 사용하기

File 클래스의 list(FilenameFilter filter) 메서드는 현재 File 객체가 가리키는 경로에 존재하는 파일 및 디렉터리 이름들을 String 배열로 반환합니다. 단, 반환되는 배열에는 지정된 필터 조건을 통과한 항목만 포함됩니다.

FilenameFilter는 메서드를 하나만 가지고 있는 인터페이스입니다.

accept(File dir, String name)

파일 확장자를 기준으로 필터링하고 싶다면 이 인터페이스를 구현한 객체를 만들어 위의 list() 메서드에 전달하면 됩니다.

예를 들어, D 드라이브 아래에 7개의 파일과 2개의 디렉터리를 포함하는 ExampleDirectory 폴더가 있다고 가정해 보겠습니다.

예제 코드

다음 Java 프로그램은 D:\ExampleDirectory 경로에 있는 jpg 파일의 이름만 추려서 출력합니다.

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

public class Sample {
    public static void main(String args[]) throws IOException {
        // 디렉터리를 나타내는 File 객체 생성
        File directoryPath = new File("D:\\ExampleDirectory");

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

        String imageFilesList[] = directoryPath.list(jpgFilefilter);
        System.out.println("지정된 디렉터리의 jpg 파일 목록:");
        for (String fileName : imageFilesList) {
            System.out.println(fileName);
        }
    }
}

실행 결과

지정된 디렉터리의 jpg 파일 목록:
cassandra_logo.jpg
cat.jpg
coffeescript_logo.jpg
javafx_logo.jpg

방법 2: NIO의 Files.walk() 사용하기 (Java 8 이상)

Java 8부터는 NIO API와 스트림(Stream)을 활용해 훨씬 간결하게 파일을 필터링할 수 있습니다. Files.walk() 메서드는 지정한 디렉터리를 하위 디렉터리까지 재귀적으로 탐색하면서 Path 객체의 스트림을 반환합니다. 여기에 filter()를 적용해 확장자가 .jpg로 끝나는 파일만 남기면 됩니다.

예제 코드

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 Example {
    public static void main(String[] args) throws IOException {
        Stream<Path> path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        path = path.filter(var -> var.toString().endsWith(".jpg"));
        path.forEach(System.out::println);
    }
}

실행 결과

Files.walk()는 전체 경로를 기준으로 결과를 반환하므로 출력에 디렉터리 경로가 함께 표시됩니다.

D:\ExampleDirectory\cassandra_logo.jpg
D:\ExampleDirectory\cat.jpg
D:\ExampleDirectory\coffeescript_logo.jpg
D:\ExampleDirectory\javafx_logo.jpg

마무리

단순한 필터링이라면 익명 클래스나 람다식으로 구현한 FilenameFilter가 편리하고, 하위 디렉터리까지 탐색하거나 복잡한 조건 처리가 필요하다면 Files.walk()와 스트림 API를 사용하는 것이 효율적입니다. 상황에 맞는 방법을 선택해 활용해 보세요.