listFiles() 메서드란?
Java의 listFiles() 메서드는 현재 File 객체가 가리키는 경로에 존재하는 모든 파일과 디렉토리의 추상 경로(abstract path) 객체들을 배열 형태로 반환합니다.
FileFilter 인터페이스는 경로명(pathname)을 걸러 주는 필터 역할을 하며, 이를 listFiles() 메서드의 매개변수로 전달할 수 있습니다. 필터가 적용되면 조건에 부합하는 파일이나 디렉토리만 결과에 포함됩니다.
따라서 특정 폴더 안의 숨김 디렉토리만 얻고 싶다면, 숨김 속성을 지닌 디렉토리만 허용하는 FileFilter를 구현한 뒤 이를 listFiles() 메서드에 인자로 넘겨주면 됩니다.
예제 1: FileFilter로 숨김 디렉토리만 조회하기
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
public class Test {
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() && dir.isHidden()) {
return true;
} else {
return false;
}
}
};
File[] list = directoryPath.listFiles(fileFilter);
System.out.println("지정된 디렉토리의 숨김 항목 목록:");
for (File fileName : list) {
System.out.println(fileName.getName());
System.out.println(fileName);
}
}
}
실행 결과
지정된 디렉토리의 숨김 항목 목록: hidden directory1 D:\ExampleDirectory\hidden directory1 hidden directory2 D:\ExampleDirectory\hidden directory2
예제 2: isHidden() 메서드 참조로 더 간결하게
File 클래스의 isHidden() 메서드를 메서드 참조(File::isHidden) 형태로 listFiles()에 전달하면, 익명 클래스를 작성하지 않고도 훨씬 짧은 코드로 숨김 파일 목록을 얻을 수 있습니다. 여기에 스트림(Stream) API를 결합하면 반복 출력까지 깔끔하게 처리할 수 있습니다.
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.stream.Stream;
public class Demo {
public static void main(String[] args) throws IOException {
File dir = new File("D:\\ExampleDirectory");
File[] files = dir.listFiles(File::isHidden);
Stream<File> fileStream = Arrays.stream(files);
fileStream.forEach(file -> System.out.println(file.getName()));
}
}
실행 결과
D:\ExampleDirectory\hidden directory1 D:\ExampleDirectory\hidden directory2
참고: 운영체제별 숨김 파일 판정 기준
숨김 파일을 판별하는 기준은 운영체제마다 다릅니다. Windows에서는 파일 속성의 '숨김(Hidden)' 플래그 설정 여부를 기준으로 삼고, Linux·macOS 등 유닉스 계열에서는 파일 이름이 마침표(.)로 시작하는지로 판단합니다. 따라서 동일한 코드라도 실행 환경에 따라 결과가 달라질 수 있으므로 주의가 필요합니다.