web-dev-qa-db-ja.com

FilenameFilterの使用

ディレクトリがあります:

File dir = new File(MY_PATH);

名前が整数の文字列として示されているすべてのファイルを一覧表示したいと思います。 「10」、「20」。
私は私が使用する必要があることを知っています:

dir.list(FilenameFilter filter);

FilenameFilterを定義するには?

P.S。つまり、ファイル名は任意の整数文字列にすることができます。 「10」または「2000000」または「3452345」。ファイル名が整数文字列である限り、桁数に制限はありません。

17
Leem.fin

overrideacceptインターフェイスFilenameFilter パラメータnameに数字のみが含まれていることを確認してください。これは matches を使用して確認できます。

String[] list = dir.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.matches("[0-9]+");
    }
});
31
Maroun

できれば、パラメーターとして File#list に渡される匿名の内部クラスのインスタンスとして。

たとえば、拡張子.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");
    }
});

ファイル名が正確に2桁の整数であるファイルのみを一覧表示するには、acceptメソッドで以下を使用できます。

return name.matches("\\d{2}");

1桁以上の場合:

return name.matches("\\d+");    

[〜#〜] edit [〜#〜](@crashprophetのコメントへの応答として)

リストするファイルの拡張子のセットを渡す

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));
}
6
A4L

Java 8なので、ラムダ式を使用してカスタムフィルターを指定できます。

dir.list((dir1, name) -> name.equals("foo"));

上記の例では、「foo」という名前のファイルのみが通過します。もちろん、独自のロジックを使用してください。

4

私はそれを次のように行います:

    File folder = new File(".");
    File[] listOfFiles = folder.listFiles();
    for (File file : listOfFiles) {
        if (file.isFile()) {
            if (file.toString().endsWith(".sql")) {
                System.out.println(file.getName());
            }
        }
    }
    System.out.println("End!!");
1
user2607028

これが私が巻き込んだものです。それはあなた自身のデザインに簡単にねじることができる素敵なラムダ式を使用しています...

File folder = new File(FullPath);
String[] files = folder.list((lamFolder, lamName) -> lamName.matches("[0-9]+"));
if(files == null) {
    System.out.println("Stuff wrongly: no matching files found.");
} else {
    for(String file : files) {
        System.out.println("HOORAY: I found this "+ file);
    }
}
0
Dave