Solución:
Debería anular accept
en el interfaz FilenameFilter
y asegúrese de que el parámetro name
solo tiene caracteres numéricos. Puede verificar esto usando matches
:
String[] list = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.matches("[0-9]+");
}
});
preferiblemente como una instancia de una clase interna anónima pasada como parámetro a la lista File #.
por ejemplo, para enumerar solo los archivos que terminan con la extensión .txt
:
File dir = new File("/home");
String[] list = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
});
Para enumerar solo los archivos cuyos nombres de archivo son números enteros de exactamente 2 dígitos, puede usar lo siguiente en el método de aceptación:
return name.matches("\d{2}");
para uno o más dígitos:
return name.matches("\d+");
EDITAR (como respuesta al comentario de @ crashprophet)
Pasar un conjunto de extensiones de archivos a la lista
class ExtensionAwareFilenameFilter implements FilenameFilter {
private final Set<String> extensions;
public ExtensionAwareFilenameFilter(String... extensions) {
this.extensions = extensions == null ?
Collections.emptySet() :
Arrays.stream(extensions)
.map(e -> e.toLowerCase()).collect(Collectors.toSet());
}
@Override
public boolean accept(File dir, String name) {
return extensions.isEmpty() ||
extensions.contains(getFileExtension(name));
}
private String getFileExtension(String filename) {
String ext = null;
int i = filename .lastIndexOf('.');
if(i != -1 && i < filename .length()) {
ext = filename.substring(i+1).toLowerCase();
}
return ext;
}
}
@Test
public void filefilter() {
Arrays.stream(new File("D:\downloads").
list(new ExtensionAwareFilenameFilter("pdf", "txt")))
.forEach(e -> System.out.println(e));
}
Desde Java 8, simplemente puede usar una expresión lambda para especificar su filtro personalizado:
dir.list((dir1, name) -> name.equals("foo"));
En el ejemplo anterior, solo los archivos con el nombre “foo” pasarán. Utilice su propia lógica, por supuesto.