Использование FileNameFilter и FileFilter - PullRequest
5 голосов
/ 30 ноября 2011

Я пишу простую программу, чтобы перечислить файлы .class в каталоге рекурсивным способом.

Первоначально я закодировал это:

public class Parsing{

    public static void main(String[] args) {
        File f=new  File(".\\");
        readRecursive(f);
    }

    private static void readRecursive(File f) {
        String[] files=f.list(  new FilterByteCode());
        if(null==files){
            files=new String[0];
        }
        for(String curr: files){
            File currFile=new File(curr);
            System.out.println(currFile.getName());
            readRecursive(currFile);
        }
    }
}//end parsing

class FilterByteCode implements FilenameFilter {


    @Override
    public boolean accept(File dir, String name) {
        if(name.endsWith(".class")){
            return acceptByteCode(dir);
        }else{
            return  (null!=dir && dir.exists() && dir.isDirectory());
        }

    }

        private boolean acceptByteCode(File dir) {
            boolean res= (null!=dir && dir.exists() && dir.isFile());
            return res;
        }

}//FilterByteCode 

Ноэтот список только каталог и подкаталоги, а не файл!

Я решил с помощью FileFilter:

private static void readRecursiveFile(File f) {
        File[] files=f.listFiles(new FilterByteCode2());
        if(null==files){
            files=new File[0];
        }
        for(File curr: files){
            System.out.println(curr.getName());
            readRecursiveFile(curr);
        }
    }

class FilterByteCode2 implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        if(null!=pathname && pathname.getName().endsWith(".class")){
            return  acceptByteCode(pathname);
        }else{
            return (null!=pathname && pathname.exists() && pathname.isDirectory());
        }
    }//accept

    private boolean acceptByteCode(File dir) {
        boolean res = (null != dir && dir.exists() && dir.isFile());
        return res;
    }

}//FilterByteCode2

и этой работы, перечисляя файл .class .

Я прочитал разницу между FileFilter и FilenameFilter , но я не нашел причину различия поведения.

1 Ответ

9 голосов
/ 30 ноября 2011

Аргумент dir в FilenameFilter#accept() представляет родительский каталог, в котором был найден файл, а не сам файл, как вы ожидаете.Таким образом, dir.isFile() всегда будет возвращать false в вашем подходе FilenameFilter, что означает, что acceptByteCode() всегда будет возвращать false.

...