2011-11-30 12 views
5

Estoy codificando un programa simple para enumerar los archivos .class en un directorio de forma recursiva.Uso de FileNameFilter y FileFilter

Inicialmente codifiqué esto:

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 

Pero esta lista sólo el directorio y subdirectorios, no el archivo!

que resolverse utilizando las 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 

y este trabajo, enumerando el archivo .class .

leí la diferencia entre el FileFilter y FilenameFilter pero no encontró la causa de la diferencia de comportamiento.

+0

¿Qué se supone que significa "." \\ "'? –

+0

Directorio actual, como ".". – alepuzio

Respuesta

9

El argumento dir en FilenameFilter#accept() representa el directorio principal en el que se encontró el archivo, no el archivo en sí, como parece esperar. Así que entre otros dir.isFile() siempre devolverá false en su enfoque FilenameFilter que hace que acceptByteCode() siempre devuelva false.