Java 删除除具有视频扩展名的文件外的所有文件

Java 删除除具有视频扩展名的文件外的所有文件,java,Java,我正在尝试从不是视频文件的目录(及其子目录,非常重要)中删除每个文件。以下是我的ProcessDirectory类: public class ProcessDirectory { private File directory; public static final String [] MOVIE_EXTENSIONS = {"avi", "mp4", "flv", "mkv"}; public ProcessDirectory(String path) { this.direct

我正在尝试从不是视频文件的目录(及其子目录,非常重要)中删除每个文件。以下是我的ProcessDirectory类:

public class ProcessDirectory {
private File directory;
public static final String [] MOVIE_EXTENSIONS = {"avi", "mp4", "flv", "mkv"};


public ProcessDirectory(String path) {
    this.directory = new File(path);
}

private Collection<File> findMovieFiles() throws IOException {
    System.out.println("Getting all .avi, .mp4 files in " + this.directory.getCanonicalPath()
            + " including those in subdirectories");
    Collection<File> videoFiles = FileUtils.listFiles(this.directory, MOVIE_EXTENSIONS, true);


    return videoFiles;
}

public void removeAllNonMovieFiles() throws IOException {
    Collection<File> movieFiles = findMovieFiles();
    Collection<File> allFilesAndFolders = FileUtils.listFilesAndDirs(this.directory, TrueFileFilter.TRUE, TrueFileFilter.TRUE);

    // have to use Iterator because otherwise it throws ConcurrentModificationException
    Iterator<File> iter = allFilesAndFolders.iterator();
    while (iter.hasNext()) {
        File currentElement = iter.next();
        if (!movieFiles.contains(currentElement)) {
            iter.remove();
        }
    }

}
它似乎不起作用-没有文件被删除。我的两个收藏都经过了很好的检查,都使用System.out进行了检查,并且它们都有正确的文件,但是它们没有删除任何内容

编辑:更改了我的代码,我认为它现在看起来更好了,但仍然不起作用。

iter.remove()
只是从集合中删除文件。您缺少实际删除文件的部分,如
文件。删除
或类似内容

你知道
java.nio.file.Files
?使用它,您甚至可以编写如下代码:

Files.walk(Paths.get("your path here"))
     .filter(isNotAMovieFile())
     .forEach(delete());

这样,您只需要实现
谓词isNotAMovieFile()
使用者删除()
,这应该非常简单。

视频文件前后添加一些日志(或System.out)。removeIf
查看此集合的大小。您将看到
视频文件
的设置是否正确。如果您仍有兴趣帮助我,我将更改代码:)但现在,您不再有以前代码中存在的
文件。delete()
。如果添加
currentElement.delete(),会发生什么就在
iter.remove()之前?在调试模式下,是否尝试查看是否在
if
语句中输入?我认为该集合类似于实际文件的图像1:1,但实际上类似于从这些对象解析的名称?例如,如果我想重命名一些文件,我不能只执行Collection.rename,而是必须使用files.rename或其他一些实际与文件交互的函数来访问它们。集合包含表示实际文件的
文件
对象。集合只是一个通用容器,可以包含任何对象。因此,除了从集合中删除对象之外,集合无法知道它在删除时应该做什么。
Files.walk(Paths.get("your path here"))
     .filter(isNotAMovieFile())
     .forEach(delete());