preferably as an instance of an anonymous inner class passsed as parameter to File#list.
for example, to list only files ending with the extension .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");
}
});
To list only files whose filenames are integers of exactly 2 digits you can use the following in the accept method:
return name.matches("\\d{2}");
for one or more digits:
return name.matches("\\d+");
EDIT (as response to @crashprophet's comment)
Pass a set of extensions of files to list
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));
}
new FileNameFilter()
and then implement an anonymous inner class to choose what file names you should accept. – Denumerable