¿Cómo verificar un archivo si existe con un comodín en Java?

Tengo un directorio, y dentro de él los archivos se llaman "a_id_XXX.zip" .

¿Cómo verificar si existe un archivo dado un id y un File dir ?

Pase un FileFilter (codificado aquí anónimamente ) en el método listFiles() del File dir, así:

 File dir = new File("some/path/to/dir"); final String id = "XXX"; // needs to be final so the anonymous class can use it File[] matchingFiles = dir.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.getName().equals("a_id_" + id + ".zip"); } }); 

Incluido como un método, se vería así:

 public static File[] findFilesForId(File dir, final String id) { return dir.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.getName().equals("a_id_" + id + ".zip"); } }); } 

y que podrías llamar como:

 File[] matchingFiles = findFilesForId(new File("some/path/to/dir"), "XXX"); 

o simplemente para verificar la existencia,

 boolean exists = findFilesForId(new File("some/path/to/dir"), "XXX").length > 0 

Creé archivos zip nombrados con a_id_123.zip, a_id_124.zip, a_id_125.zip, a_id_126.zip y parece funcionar bien, pero no estoy seguro de si es la respuesta adecuada para usted. La salida será la siguiente si existen archivos mencionados anteriormente

  • encontrado a_id_123.zip
  • encontrado a_id_124.zip
  • encontrado a_id_125.zip
  • encontrado a_id_126.zip

     public static void main(String[] args) { String pathToScan = "."; String fileThatYouWantToFilter; File folderToScan = new File(pathToScan); // import -> import java.io.File; File[] listOfFiles = folderToScan.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { if (listOfFiles[i].isFile()) { fileThatYouWantToFilter = listOfFiles[i].getName(); if (fileThatYouWantToFilter.startsWith("a_id_") && fileThatYouWantToFilter.endsWith(".zip")) { System.out.println("found" + " " + fileThatYouWantToFilter); } } } } 

Esta solución se generaliza en la respuesta de Bohemian. Utiliza expresiones regulares y también reemplaza la clase interna con expresiones Java 8 lambda. Gracias @Bohemian por la implementación original.

 import java.io.File; public class FileFinder { public static void main(String[] args){ File directory = new File("D:\\tmp"); String id = "20140430104033"; for (File f : findFilenamesWithId(id, directory)){ System.out.println(f.getAbsoluteFile()); } } /** Finds files in the specified directory whose names are formatted as "a_id_ID.zip" */ public static File[] findFilenamesWithId(String ID, File dir) { return findFilenamesMatchingRegex("^a_id_" + ID + "\\.zip$", dir); } /** Finds files in the specified directory whose names match regex */ public static File[] findFilenamesMatchingRegex(String regex, File dir) { return dir.listFiles(file -> file.getName().matches(regex)); } } 

Java 7 tiene un buen soporte para la coincidencia de patrones (PathMatcher) y el recorrido recursivo de directorios (Files.walkFileTree ()). En el contexto de la pregunta original, esta página en la documentación de Oracle de Java es un buen comienzo:

Buscar archivos: http://docs.oracle.com/javase/tutorial/essential/io/find.html