Dev/Java

[java] FilenameFilter, FileFilter

창문닦이 2020. 6. 10. 23:51

File class는 파일 내부의 리스트를 찾는 메소드를 세 개 갖고 있다.

  • public String[] list( FilenameFilter filter ); 디렉토리의 파일목록을 String 배열로 반환
  • public File[] listFiles( FileFilter filter ); FileFilter 인스턴스에 구현된 조건에 맞는 File을 배열로 반환
  • public File[] listFiles( FilenameFilter filter ); FilenameFilter 인터페이스가 구현된 조건에 맞는 File을 배열로 반환

interface FileFilter와 FilenameFilter는 특정 파일이나 디렉토리를 필터링 하여 리스트를 추출할 필요가 있을 때 사용한다.

두개의 차이점은 정의된 메소드인데 FileFilter 인터페이스에는 accept(File pathname) 이 있고. FilenameFilter인터페이스에는 accept(File dir, String name)가 있다. 파라미터를 확인하고 본인의 편의에 맞게 사용하면 될 것 같다.

 

FilenameFilter 인터페이스 

@FunctionalInterface
public interface FilenameFilter {
    /**
     * Tests if a specified file should be included in a file list.
     *
     * @param   dir    the directory in which the file was found.
     * @param   name   the name of the file.
     * @return  <code>true</code> if and only if the name should be
     * included in the file list; <code>false</code> otherwise.
     */
    boolean accept(File dir, String name);
}

 

활용 소스 

FilenameFilter 인터페이스 사용 시 accept 메서드를 구현하여 filter결과를 boolean 형식으로 리턴하면 된다.

	
    private static final String NUMBER_PATTERN = "^[0-9]+$";
    
    /**
	 * 숫자명으로 된 디렉토리만 필터링하여 추출
	 * @param path
	 * @return
	 */
	public File[] selectNumberDirLists(Path path) {
		File fileLists[] = null;
		
		if (!Files.isDirectory(path)) {
			return fileLists;
		}
		
		fileLists = path.toFile().listFiles(new FilenameFilter() {			
			@Override
			public boolean accept(File dir, String name) {
				if (!dir.isDirectory()) {
					// 디렉토리가 아닌 경우
					return false; 
				}
				if (!Pattern.matches(NUMBER_PATTERN, name)) {
					// 디렉토리 명이 숫자 패턴이 아닌 경우
					return false;
				}              
				return true;
			}
		});

		return fileLists;
	}
    
    /**
	 * exe 파일만 필터링하여 추출
	 * @param path
	 * @return
	 */
	public File[] selectExeFileLists(Path path) {
		File fileLists[] = null;
        
    	fileLists = path.toFile().listFiles(new FilenameFilter() {			
			@Override
			public boolean accept(File dir, String name) {
            	return name.endsWith(".exe");
			}
		});
    
		return fileLists;
    }
    
    

'Dev > Java' 카테고리의 다른 글

[effective-java] 모든 객체의 공통 메소드  (0) 2020.11.29
[java] jmeter 성능 테스트  (0) 2020.05.20
[effective-java] 동시성  (0) 2020.01.15
[effective-java] 일반적인 프로그래밍 원칙  (0) 2020.01.14
[java] CSV 파싱하기  (0) 2019.12.13