web-dev-qa-db-ja.com

FileNameExtensionFilterでFile.listFilesを使用する

ディレクトリ内の特定の拡張子を持つファイルのリストを取得したいと思います。 API(Java 6)には、これを行うメソッドFile.listFiles(FileFilter)があります。

特定の拡張子が必要なので、FileNameExtensionFilterを作成しました。ただし、listFilesを使用すると、コンパイルエラーが発生します。 FileNameExtensionFilter implements FileFilter以来、これができるはずだと思いました。コードは次のとおりです。

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

最後の行は、コンパイルエラーを示しています。

file型のlistFiles(FileNameFilter)メソッドは、FileNameExtensionFilter型の引数には適用できません

listFiles(FileFilter)ではなく、listFiles(FileNameFilter)を使用しようとしています。コンパイラがこれを認識しないのはなぜですか?

これは、FileFilterを拡張する独自の拡張フィルターを作成した場合に機能します。私は自分で書くよりもFileNameExtensionFilterを使いたいです。私は何を間違えていますか?

74
Anu

FileNameExtensionFilter クラスは、 SwingJFileChooser で使用するためのものです。

代わりに FilenameFilter を使用してみてください。例えば:

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

FileNameExtensionFilterを使用する具体的な理由はありますか?私はこれが機能することを知っています。

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

Java 8構文の1行:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
24
Serġan

これはすぐに作成したもので、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;
    }
}

さまざまな画像形式の例を次に示します。

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

Duh .... listFilesにはJava.io.FileFilterが必要です。 FileNameExtensionFilterはjavax.swing.filechooser.FileFilterを拡張します。 Java.io.FileFilterのインスタンスを実装することで問題を解決しました

編集:@cFreinerの答えに似たものを使用しました。独自の実装を記述する代わりにJava AP​​Iメソッドを使用しようとしていたため、FileNameExtensionFilterを使用しようとしていました。私のアプリケーションには多くのFileChoosersがあり、そのためにFileNameExtensionFiltersを使用しましたが、誤ってJava.io.FileFilterを拡張していると思っていました。

1
Anu

Javaラムダ(Java 8以降で利用可能)を使用すると、javax.swing.filechooser.FileFilterJava.io.FileFilterに1行で簡単に変換できます。

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