88

ディレクトリ内の特定の拡張子を持つファイルのリストを取得したいと考えています。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)ます。コンパイラがこれを認識しないのはなぜですか?

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

4

6 に答える 6

188

このクラスは、 Swingをで使用するFileNameExtensionFilterことを目的としています。JFileChooser

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");
    }
});
于 2011-04-22T01:01:52.487 に答える
30

使用したい具体的な理由はありますFileNameExtensionFilterか?私はこれがうまくいくことを知っています。

private File[] getNewTextFiles() {
    return dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }
    });
}
于 2011-04-22T01:06:07.667 に答える
1

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

編集:@cFreinerの回答に似たものを使用しました。独自の実装を作成する代わりに Java API メソッドを使用しようとしていたため、FileNameExtensionFilter を使用しようとしていました。私のアプリケーションには多くの FileChooser があり、そのために FileNameExtensionFilters を使用しましたが、java.io.FileFilter も拡張していると誤って想定しました。

于 2011-04-22T16:53:49.580 に答える
1

これは私がすぐに作成したもので、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"});
于 2012-11-02T07:03:12.780 に答える