0

我有一个使用以下行填充的文件的 LinkedList:

File file = new File(directoryPath);
List<File> filesList = new LinkedList<File>(Arrays.asList(file.listFiles()));

这让我得到了给定 directoryPath 字符串中的所有文件。

然后我有一个允许的文件扩展名数组,并想删除其中不匹配的任何文件(不是目录)。

String[] file_ext = new String[] {"ext1", "ext2", "ext3"};

我该如何继续实施呢?

4

4 回答 4

1

你可以使用这样的东西

final String[]  file_ext = new String[] {"ext1", "ext2", "ext3"};

FilenameFilter filter = new FilenameFilter() {

    @Override
    public boolean accept(File dir, String name) {
            for(int i=file_ext.length-1;i>=0;i--)
                if( name.endsWith( "." + file_ext[i]) )
                    return true;
            return false;
        }
    };

File file = new File(directoryPath);
List<File> filesList = new LinkedList<File>(Arrays.asList(file.listFiles(filter)));

更新: 根据“Borsi the Spider”评论,为了避免错误匹配,例如files.notext1,搜索.也匹配字符

于 2013-08-04T13:01:24.090 回答
0

用一个FileNameExtensionFilter

final FileNameExtensionFilter fnef = new FileNameExtensionFilter("", "ext1", "ext2", "ext3");
final List<File> files = new LinkedList<>();
for(final File f : new File(directoryPath).listFiles()) {
    if(fnef.accept(f)) files.add(f);
}

这来自 Swing,但它完全符合您的要求,并且它对 EDT 没有任何依赖关系或任何奇怪的东西。

你甚至可以将它包裹FileNameExtensionFilter在一个FileFilter立面中并使其成为单线:

final List<File> filesList = new LinkedList<>(Arrays.asList(new File(directoryPath).listFiles(new FileFilter() {
    final FileNameExtensionFilter fnef = new FileNameExtensionFilter("", "ext1", "ext2", "ext3");

    @Override
    public boolean accept(File pathname) {
        return fnef.accept(pathname);
    }
})));
于 2013-08-04T13:07:18.770 回答
0
  1. 获取文件列表并检查它们的名称是否以任何 ext from 结尾file_ext,如果是,将它们添加到列表filesToDelete
  2. filesToDelete从列表中删除文件。
于 2013-08-04T12:50:30.920 回答
0

使用FilenameFilter,可以在此处找到示例

于 2013-08-04T12:52:18.617 回答