中找到一个示例
我有一个文件的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"};
我该如何着手实施?
您可以使用类似的东西
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
等错误匹配,搜索将匹配.
字符以及
- 获取文件列表,检查它们的名称是否以
file_ext
中的任何文本结尾,如果是,则将它们添加到filesToDelete
列表中 - 从
filesToDelete
列表中删除文件
使用文件名过滤器,可以在
使用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);
}
})));