Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use of FilenameFilter

Tags:

I have a directory:

File dir = new File(MY_PATH); 

I would like to list all the files whose name is indicated as integer numbers strings, e.g. "10", "20".
I know I should use:

dir.list(FilenameFilter filter); 

How to define my FilenameFilter?

P.S. I mean the file name could be any integer string, e.g. "10" or "2000000" or "3452345". No restriction in the number of digits as long as the file name is a integer string.

like image 924
Leem.fin Avatar asked Nov 12 '13 15:11

Leem.fin


2 Answers

You should override accept in the interface FilenameFilter and make sure that the parameter name has only numeric chars. You can check this by using matches:

String[] list = dir.list(new FilenameFilter() {     @Override     public boolean accept(File dir, String name) {         return name.matches("[0-9]+");     } }); 
like image 76
Maroun Avatar answered Sep 20 '22 22:09

Maroun


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)); } 
like image 29
A4L Avatar answered Sep 20 '22 22:09

A4L