FileNameExtensionFilterでFile.listFilesを使用する


84

ディレクトリ内の特定の拡張子を持つファイルのリストを取得したいと思います。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で書くよりも使いたいです。私は何が間違っているのですか?


まず、最初の引数として「txt」を、2番目の引数として「textonly」を使用する必要があります。
lobster1234 2011

コードは正しいです、@ lobster1234。参照:docs.oracle.com/javase/7/docs/api/javax/swing/filechooser/...
james.garriss

回答:


184

このFileNameExtensionFilterクラスは、Swingをで使用することを目的としてい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");
    }
});

38

Java 8構文のワンライナー:

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

7
中括弧を省略して戻ることができます:pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
Gabor Szarnyas 2017

別の解決策:Files.list(Paths.get("your/path")).filter(path -> path.toString().endsWith(".txt")).collect(Collectors.toList());
CeePlusPlus

28

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

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

1

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

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


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

10
良いですが、私の新しいマントラは、もっと複雑にする必要がない限り、物事をシンプルに保つことです。つまり、本当に自分で作成する必要がない限り、JavaAPIメソッド/クラスを使用します。
anu 2012年

@JeremyTrifiloなぜpath [pStart --i]を実行したのですか?コードの0x20?
Sohil 2016年

1
なぜ車輪の再発明をするのですか?
james.garriss 2017年

| 20は大文字と小文字のバリエーションでした。強制的に文字に32を追加し、チェック用の小文字にします。したがって、ファイルをExample.PnGまたはExample.pNgとして保存しても、それが取得されます。私は通常、このようなことをやり直すことはありませんが、これらがどのように機能し、何ができるかを理解できれば素晴らしい学習になるので、やり直します。ただし、パフォーマンスの向上は最小限であり、これを高速にする必要がないため、このシナリオでは冗長であるという意味がわかります。
ジェレミートリフィロ2018

1

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.