2011-11-30 3 views
5

Я кодирую простую программу для перечисления файлов .class в каталоге рекурсивным способом.Использование FileNameFilter и FileFilter

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

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, но я не нашел причину разницы поведения.

+0

Что означает ''. \\ ''? –

+0

Текущий каталог, как «.». – alepuzio

ответ

9

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

Смежные вопросы