2011-11-30 29 views
5

我正在編寫一個簡單的程序,以遞歸的方式列出目錄中的文件.classFileNameFilter和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

FilenameFilter#accept()中的dir參數代表文件被發現的父目錄,而不是您所期望的文件本身。所以在其他dir.isFile()將始終返回false在您的FilenameFilter方法,這使得acceptByteCode()將始終返回false