이전글


사용법 설명에 앞서 testDir 이라는 디렉터리 하위에 test1.txt, text1.log ~ test3.txt, text3.log 파일 그리고 서브디렉터리 subDir이라는 디렉터리가 있다고 가정하겠습니다.




FIle 목록 구하기
File 객체의 listFiles() 메서드를 이용하면 현재 File 객체가 디렉터리인 경우 자신의 하위에 존재하는 파일 및 서브 디렉터리 목록을 구할 수 있습니다.
import java.io.File;                                                                         
 
 
public class FileFilterTest { 
     public static void main(String[] args) { 
           File testDir = new File("E:\\testDir"); 
           
           File[] fileNameList = testDir.listFiles(); 
           
           for(File curFile : fileNameList) { 
                System.out.println(curFile.getPath()); 
           }
           
     }
}
cs


별다른 어려움 없이 testDir 하위의 모든 파일 및 서브 디렉터리명이 출력되었습니다.
E:\testDir\subDir
E:\testDir\test1.log
E:\testDir\test1.txt
E:\testDir\test2.log
E:\testDir\test2.txt
E:\testDir\test3.log
E:\testDir\test3.txt




FIle 목록 필터링하기
File 객체의 매개변수 없는 listFiles() 메서드를 이용하면 모든 파일 목록을 구할 수 있지만 원하는 경우 특정 조건에 맞는 파일들만을 필터링해야 하는 경우가 있습니다.

이때에는 오버로딩 된 listFiles(FilenameFilter filter) 또는 listFiles(FileFilter filter) 메서드를 사용할 수 있습니다. 두 메서드는 넘겨받는 필터 관련 객체를 통해 파일 목록을 반복문으로 돌며 순회하면서 true가 리턴된 객체만을 필터링하여 배열로 리턴합니다.

 



FilenameFilter로 .log 파일만을 필터링하기
먼저 FilenameFilter 인터페이스의 사용법부터 보자면 FilenameFilter는 인터페이스이기 때문에 클래스로 구현하여 사용해야 합니다. 이러한 일회성 구현 인터페이스는 익명 클래스로 구현과 동시에 인스턴스화 하여 사용하는 것이 일반적이므로 다음과 같이 accept() 메서드를 구현하여 사용합니다. 인터페이스에 대한 설명은 글 하단을 참고합니다.
import java.io.File;                                                                         
import java.io.FilenameFilter; 
 
 
public class FileFilterTest { 
     public static void main(String[] args) { 
           File testDir = new File("E:\\testDir"); 
           
           File[] fileNameList = testDir.listFiles(new FilenameFilter() { 
                
                @Override 
                public boolean accept(File dir, String name) { 
                     return name.endsWith("log"); 
                }
           });
           
           
           for(File curFile : fileNameList) { 
                System.out.println(curFile.getPath()); 
           }
           
     }
}
cs


.log 파일만을 출력했습니다.
E:\testDir\test1.log
E:\testDir\test2.log
E:\testDir\test3.log






FileFilter로 디렉터리만 필터링하기
FileFilter또한 인터페이스이므로 구현을 해야 인스턴스화 시킬 수 있습니다. 역시나 마찬가지로 익명 클래스로 구현하는 것이 일반적입니다.
import java.io.File;                                                                         
import java.io.FileFilter; 
 
public class FileFilterTest { 
     public static void main(String[] args) { 
           File testDir = new File("E:\\testDir"); 
           
           File[] fileNameList = testDir.listFiles(new FileFilter() { 
                
                @Override 
                public boolean accept(File pathname) { 
                     return pathname.isDirectory(); 
                }
           });
           
           
           for(File curFile : fileNameList) { 
                System.out.println(curFile.getPath()); 
           }
           
     }
}
cs


accept() 메서드에서 isDirectory() 메서드를 통해 현재 순회하는 File 객체가 디렉터리인 경우에만 true를 리턴하게 하여 필터링 하였습니다.
E:\testDir\subDir






FileFilter 인터페이스
accept 메서드를 오버라이딩 하여 사용하며, 매개변수로는 순회중인 File이 넘겨집니다. FilenameFilter가 파일명을 기준으로 필터링할 때 주로 사용된다면 FileFilter는 그 밖의 다양한 정보(파일 수정일 같은)를 기준으로 필터링할 때 사용됩니다. accept() 메서드가 true를 리턴하는 파일에 대해서만 필터링 됩니다.
public interface FileFilter {
    boolean accept(File pathname);
}                                                                                            
cs


FilenameFilter 인터페이스
accept 메서드를 오버라이딩 하여 사용하며, 매개변수로는 현재 디렉터리 File 객체순회중인 파일의 파일명이 넘겨집니다.FileFilter가 파일의 다양한 정보를 기준으로 필터링할 때 주로 사용된다면 FilenameFilter는 파일명만을 기준으로 필터링할 때 사용됩니다. accept() 메서드가 true를 리턴하는 파일에 대해서만 필터링 됩니다.
public interface FilenameFilter {
    boolean accept(File dir, String name);
}                                                                                            
cs





블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!