ejemplo - filenamefilter java
Uso de FilenameFilter (3)
Debe sobrescribir accept
en la interfaz FilenameFilter
y asegurarse de que el name
del parámetro tenga solo 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]+");
}
});
Tengo un directorio:
File dir = new File(MY_PATH);
Me gustaría enumerar todos los archivos cuyo nombre se indica como cadenas de números enteros, por ejemplo, "10", "20".
Sé que debería usar:
dir.list(FilenameFilter filter);
¿Cómo definir mi FilenameFilter
?
PD Quiero decir que el nombre del archivo podría ser cualquier cadena entera, por ejemplo, "10" o "2000000" o "3452345". No hay restricción en el número de dígitos, siempre y cuando el nombre del archivo sea una cadena entera.
Lo hago como:
File folder = new File(".");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
if (file.isFile()) {
if (file.toString().endsWith(".sql")) {
System.out.println(file.getName());
}
}
}
System.out.println("End!!");
preferiblemente como una instancia de una clase interna anónima pasada como parámetro a la lista de archivos # .
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 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+");
EDIT (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));
}