我有一个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"};
我该如何继续实施?
答案 0 :(得分: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
之类的错误匹配,搜索也匹配.
字符
答案 1 :(得分:0)
file_ext
的任何转发结尾,如果是,请将其添加到filesToDelete
filesToDelete
列表中删除文件。答案 2 :(得分:0)
使用FilenameFilter,可以找到一个示例here
答案 3 :(得分:0)
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);
}
})));