java - filenamefilter - Usando File.listFiles con FileNameExtensionFilter
listfiles java (6)
¿Hay alguna razón específica por la que desee usar 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");
}
});
}
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 uso listFiles
con esto. Supuse que como FileNameExtensionFilter implements FileFilter
, 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 el tipo File no es aplicable a los 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?
Aquí hay algo que hice 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;
}
}
Aquí hay un ejemplo para varios formatos de imágenes.
private static final ExtensionsFilter IMAGE_FILTER =
new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
Con java lambdas (disponible desde java 8) simplemente puede convertir javax.swing.filechooser.FileFilter
a java.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);
Duh .... listFiles requiere java.io.FileFilter. FileNameExtensionFilter extiende javax.swing.filechooser.FileFilter. Resolví mi problema implementando una instancia de java.io.FileFilter
Editar: Utilicé algo similar a la respuesta de @ cFreiner. Intenté usar un método API de Java en lugar de escribir mi propia implementación, y es por eso que 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.
La clase FileNameExtensionFilter
está pensada para que Swing se use en un JFileChooser
.
Intenta usar un FilenameFilter
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");
}
});
Sintaxis de One-liner in java 8:
File[] txts = pdfTestDir.listFiles(
(dir, name) -> {
return name.toLowerCase().endsWith(".txt");
}
);