2010-01-20 17 views
63

Estoy buscando una forma de obtener una lista de archivos que coincidan con un patrón (prefix regex) en un directorio determinado.Listado de archivos en un directorio que coincida con un patrón en Java

He encontrado un tutorial en línea que utiliza el paquete commons-io de Apache con el siguiente código:

Collection getAllFilesThatMatchFilenameExtension(String directoryName, String extension) 
{ 
    File directory = new File(directoryName); 
    return FileUtils.listFiles(directory, new WildcardFileFilter(extension), null); 
} 

Pero eso sólo devuelve una colección de base (Según the docs es una colección de java.io.File). ¿Hay alguna forma de hacer esto que devuelva un tipo de colección genérica segura?

+0

por qué no hacer acabas de agregar un elenco? Supongo que la colección base es por razones de compatibilidad (con versiones anteriores de Java). Si quiere estar absolutamente seguro, puede simplemente crear una copia y agregar los elementos después de una verificación de tipo (los genéricos son simplemente comprobaciones de tiempo de compilación, de todos modos) – bertolami

+0

@bertolami, no coloque las respuestas en los comentarios. :) –

+1

5 años después de que se hizo el comentario ... Esa es una poderosa necromancia allí @LimitedAtonement –

Respuesta

96

Ver File#listFiles(FilenameFilter).

File dir = new File("."); 
File [] files = dir.listFiles(new FilenameFilter() { 
    @Override 
    public boolean accept(File dir, String name) { 
     return name.endsWith(".xml"); 
    } 
}); 

for (File xmlfile : files) { 
    System.out.println(xmlfile); 
} 
+1

Esto significa que java lee todos los archivos y luego descarta aquellos que no coinciden. ¿No es esto terriblemente lento en comparación con cualquier comando del sistema que se filtre? – flaschenpost

+1

@flaschenpost No necesariamente, ya que los documentos no prometen cómo la implementación maneja el almacenamiento en caché y otros detalles relacionados con el rendimiento. El límite principal en cualquier método de este tipo es la llamada de IO al disco para leer los metadatos del archivo. Un comando del sistema todavía tendría que leer toda la misma información, por lo que probablemente esté lo suficientemente cerca como para que no valga la pena preocuparse. Manejarlo en Java puro permite que otra persona maneje los problemas específicos de la plataforma relacionados con esos metadatos. – Morgen

+1

OK. Simplemente estoy acostumbrado a todos los idiomas con un método 'glob', y espero que se ejecute dentro de la implementación del sistema de archivos y que sea alrededor de 100 veces más rápido (pero no lo he comprobado). Pero todavía tengo que acostumbrarme al estilo java, donde "rápido" significa segundos en lugar de nanosegundos. ;-) – flaschenpost

14

El siguiente código creará una lista de archivos basados ​​en el método de la FileNameFilter aceptar.

List<File> list = Arrays.asList(dir.listFiles(new FilenameFilter(){ 
     @Override 
     public boolean accept(File dir, String name) { 
      return name.endsWith(".exe"); // or something else 
     }})); 
+0

Esto necesita especificar un bit de coincidencia de patrón. – BobMcGee

0

¿Qué pasa con una envoltura alrededor de su código existente:

public Collection<File> getMatchingFiles(String directory, String extension) { 
    return new ArrayList<File>()( 
     getAllFilesThatMatchFilenameExtension(directory, extension)); 
} 

voy a lanzar una advertencia sin embargo. Si puedes vivir con esa advertencia, entonces has terminado.

12

Desde Java 7 se puede java.nio el paquete para conseguir el mismo resultado:

Path dir = ...; 
List<File> files = new ArrayList<>(); 
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{java,class,jar}")) { 
    for (Path entry: stream) { 
     files.add(entry.toFile()); 
    } 
    return files; 
} catch (IOException x) { 
    throw new RuntimeException(String.format("error reading folder %s: %s", 
    dir, 
    x.getMessage()), 
    x); 
} 
25

Desde Java 8 se puede utilizar lambdas y alcanzar código más corto:

File dir = new File(xmlFilesDirectory); 
File[] files = dir.listFiles((d, name) -> name.endsWith(".xml")); 
1
import java.io.BufferedReader; 

import java.io.File; 

import java.io.FileReader; 

import java.io.IOException; 

import java.util.Map; 

import java.util.Scanner; 

import java.util.TreeMap; 

public class CharCountFromAllFilesInFolder { 

    public static void main(String[] args)throws IOException { 

     try{ 

      //C:\Users\MD\Desktop\Test1 

      System.out.println("Enter Your FilePath:"); 

      Scanner sc = new Scanner(System.in); 

      Map<Character,Integer> hm = new TreeMap<Character, Integer>(); 

      String s1 = sc.nextLine(); 

      File file = new File(s1); 

      File[] filearr = file.listFiles(); 

      for (File file2 : filearr) { 
       System.out.println(file2.getName()); 
       FileReader fr = new FileReader(file2); 
       BufferedReader br = new BufferedReader(fr); 
       String s2 = br.readLine(); 
       for (int i = 0; i < s2.length(); i++) { 
        if(!hm.containsKey(s2.charAt(i))){ 
         hm.put(s2.charAt(i), 1); 
        }//if 
        else{ 
         hm.put(s2.charAt(i), hm.get(s2.charAt(i))+1); 
        }//else 

       }//for2 

       System.out.println("The Char Count: "+hm); 
      }//for1 

     }//try 
     catch(Exception e){ 
      System.out.println("Please Give Correct File Path:"); 
     }//catch 
    } 
} 
Cuestiones relacionadas