2009년 5월 12일 화요일

FilenameFilter를 이용한 지정된 파일이름만 가져오기

java.io 패키지에 FileFilter와 FilenameFilter 인터페이스가 존재한다. 이 둘은 각각 인터페이스를 implements하여 구현한 코드를 File.listFiles(FileFilter filter) 를 이용할 때 사용하게 된다. 일단 여기서는 FilenameFilter를 이용하여 일정한 확장자를 가진 파일만 file list로 얻어오는 예제를 살펴보자.

먼저, FilenameFilter를 이용한 JPEGFileFilter.java 클래스를 만들어본다.

package net.wiseant.io.util;

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

/**
 * @author SangHyup Lee
 * @version 1.0
 *
 */
public class JPEGFileFilter implements FilenameFilter {

    /* (non-Javadoc)
     * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
     */
    public boolean accept(File dir, String name) {
        // TODO Auto-generated method stub
        return name.endsWith(".jpg");
    }

}


JPEG파일의 확장자가 jpg인 파일에 대해서 true를 리턴해 준다고 생각하면 된다. 다음은 이를 이용한 간단한 파일 리스트를 얻어오는 테스트 프로그램을 작성해 보자. '.JPG' 파일은 자바에서는 대소문자를 구분함으로 제외된다.

이제 해당 디렉토리의 파일 리스트를 얻어올 때 JPEGFileFilter를 이용하여 확장자가 jpg 인 파일만 얻어오자.

package net.wiseant.junit.io;

import java.io.File;

import net.wiseant.io.util.JPEGFileFilter;

import junit.framework.TestCase;

/**
 * @author Sang Hyup Lee
 * @version 1.0
 *
 */
public class FilenameFilterTest extends TestCase {

    private String workDirectory = "";
    
    /* (non-Javadoc)
     * @see junit.framework.TestCase#setUp()
     */
    protected void setUp() throws Exception {
        super.setUp();
        workDirectory = "D:\\Photos";
    }

    public void testJPEGFileFilter() {
        File currentDirectory = new File(workDirectory);
        File[] fileList = null;
        JPEGFileFilter jpegFileFilter = new JPEGFileFilter();
        
        if ( currentDirectory.exists() && currentDirectory.isDirectory() ) {
            fileList = currentDirectory.listFiles(jpegFileFilter);
        }
        
        assertEquals(7, fileList.length);
    }
    
}


FilenameFilter를 implements 하여 구현한 코드는 반드시 public boolean accept(File dir, String name) 메소드를 구현해야 하는데 이를 잘 이용하면 이 외에도 다양한 방법으로 파일 리스트를 얻어올 수 있다.

댓글 없음: