Me gustaría obtener una lista de archivos con una extensión específica en un directorio. En la API (Java 6), veo un método File.listFiles(FileFilter)
que haría esto.
Como necesito una extensión específica, creé un FileNameExtensionFilter
. Sin embargo, obtengo un error de compilación cuando lo uso listFiles
con esto. Supuse que FileNameExtensionFilter implements FileFilter
, desde entonces , debería poder hacer esto. El código sigue:
FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);
La última línea muestra un error de compilación:
El método listFiles (FileNameFilter) en tipo File no es aplicable para argumentos de tipo FileNameExtensionFilter
Estoy tratando de usar listFiles(FileFilter)
, no listFiles(FileNameFilter)
. ¿Por qué el compilador no reconoce esto?
Esto funciona si escribo mi propio filtro de extensión extendiendo FileFilter
. Prefiero usar FileNameExtensionFilter
que escribir el mío. ¿Qué estoy haciendo mal?
Respuestas:
La
FileNameExtensionFilter
clase está pensada para que Swing se utilice en aJFileChooser
.Intente usar un
FilenameFilter
en su lugar. Por ejemplo:File dir = new File("/users/blah/dirname"); File[] files = dir.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".txt"); } });
fuente
Una línea en la sintaxis de Java 8:
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
fuente
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
Files.list(Paths.get("your/path")).filter(path -> path.toString().endsWith(".txt")).collect(Collectors.toList());
¿Existe una razón específica por la que desea utilizar
FileNameExtensionFilter
? Sé que esto funciona ...private File[] getNewTextFiles() { return dir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".txt"); } }); }
fuente
Duh .... listFiles requiere java.io.FileFilter. FileNameExtensionFilter extiende javax.swing.filechooser.FileFilter. Resolví mi problema implementando una instancia de java.io.FileFilter
Editar: Usé algo similar a la respuesta de @ cFreiner. Estaba tratando de usar un método de API de Java en lugar de escribir mi propia implementación, por eso estaba tratando de usar FileNameExtensionFilter. Tengo muchos FileChoosers en mi aplicación y he usado FileNameExtensionFilters para eso y asumí erróneamente que también estaba extendiendo java.io.FileFilter.
fuente
Aquí hay algo que acabo de hacer rápidamente y debería funcionar mucho mejor que File.getName (). EndsWith (". Xxxx");
import java.io.File; import java.io.FileFilter; public class ExtensionsFilter implements FileFilter { private char[][] extensions; private ExtensionsFilter(String[] extensions) { int length = extensions.length; this.extensions = new char[length][]; for (String s : extensions) { this.extensions[--length] = s.toCharArray(); } } @Override public boolean accept(File file) { char[] path = file.getPath().toCharArray(); for (char[] extension : extensions) { if (extension.length > path.length) { continue; } int pStart = path.length - 1; int eStart = extension.length - 1; boolean success = true; for (int i = 0; i <= eStart; i++) { if ((path[pStart - i] | 0x20) != (extension[eStart - i] | 0x20)) { success = false; break; } } if (success) return true; } return false; } }
A continuación, se muestra un ejemplo de varios formatos de imágenes.
private static final ExtensionsFilter IMAGE_FILTER = new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
fuente
Con java lambdas (disponible desde java 8), simplemente puede convertir
javax.swing.filechooser.FileFilter
ajava.io.FileFilter
en una línea.javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg"); java.io.FileFilter ioFilter = file -> swingFilter.accept(file); new File("myDirectory").listFiles(ioFilter);
fuente