2011-11-30 5 views
5

Sto codificando un semplice programma per elencare i file .class in una directory in modo ricorsivo.Utilizzo di FileNameFilter e FileFilter

Inizialmente ho codificato questo:

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 

Ma questa lista solo la directory e sottodirectory, non il file!

ho risolto utilizzando il 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 

e questo lavoro, elencando il file .class.

ho letto la differenza tra il FileFilter e FilenameFilter ma non mi hanno trovato la causa della differenza di comportamento.

+0

cosa si intende per ". \\" '? –

+0

Directory corrente, come ".". – alepuzio

risposta

9

L'argomento dir in FilenameFilter#accept() rappresenta la directory padre in cui è stato trovato il file, non il file stesso come sembra. Quindi, tra gli altri dir.isFile() restituirà sempre false nell'approccio FilenameFilter che fa sì che acceptByteCode() restituisca sempre false.