개요
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를 사용하는 것이 효율적입니다. 상황에 맞는 방법을 선택해 활용해 보세요.