Using File.listFiles with FileNameExtensionFilter

JavaFileFilterJava 6

Java Problem Overview


I would like to get a list of files with a specific extension in a directory. In the API (Java 6), I see a method File.listFiles(FileFilter) which would do this.

Since I need a specific extension, I created a FileNameExtensionFilter. However I get a compilation error when I use listFiles with this. I assumed that since FileNameExtensionFilter implements FileFilter, I should be able to do this. Code follows:

FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir  = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);

The last line shows a compilation error:

> method listFiles(FileNameFilter) in type File is not applicable for arguments of type FileNameExtensionFilter

I am trying to use listFiles(FileFilter), not listFiles(FileNameFilter). Why does the compiler not recognize this?

This works if I write my own extension filter extending FileFilter. I would rather use FileNameExtensionFilter than write my own. What am I doing wrong?

Java Solutions


Solution 1 - Java

The FileNameExtensionFilter class is intended for Swing to be used in a JFileChooser.

Try using a FilenameFilter instead. For example:

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");
	}
});

Solution 2 - Java

One-liner in java 8 syntax:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));

Solution 3 - Java

Is there a specific reason you want to use FileNameExtensionFilter? I know this works..

private File[] getNewTextFiles() {
	return dir.listFiles(new FilenameFilter() {
		@Override
		public boolean accept(File dir, String name) {
			return name.toLowerCase().endsWith(".txt");
		}
	});
}

Solution 4 - Java

With java lambdas (available since java 8) you can simply convert javax.swing.filechooser.FileFilter to java.io.FileFilter in one line.

javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);

Solution 5 - Java

Here's something I quickly just made and it should perform far better than 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;
	}
}

Here's an example for various images formats.

private static final ExtensionsFilter IMAGE_FILTER = 
      new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});

Solution 6 - Java

Duh.... listFiles requires java.io.FileFilter. FileNameExtensionFilter extends javax.swing.filechooser.FileFilter. I solved my problem by implementing an instance of java.io.FileFilter

Edit: I did use something similar to @cFreiner's answer. I was trying to use a Java API method instead of writing my own implementation which is why I was trying to use FileNameExtensionFilter. I have many FileChoosers in my application and have used FileNameExtensionFilters for that and I mistakenly assumed that it was also extending java.io.FileFilter.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAnuView Question on Stackoverflow
Solution 1 - JavaWhiteFang34View Answer on Stackoverflow
Solution 2 - JavaSerġanView Answer on Stackoverflow
Solution 3 - JavaCFreinerView Answer on Stackoverflow
Solution 4 - JavaMarcin MikosikView Answer on Stackoverflow
Solution 5 - JavaJeremy TrifiloView Answer on Stackoverflow
Solution 6 - JavaAnuView Answer on Stackoverflow