Java - 在文件系统

时间:2016-01-15 22:10:32

标签: java io filesystems

我正在完成学校作业,我们正在做一个简单的文件管理器,它应该将带有后缀"jpg"(例如)的所有文件移动到另一个文件夹中。问题是我们应该递归遍历所有文件夹。

示例:您在文件夹“downloads”中:

--downloads
----me.jpg
----smth.doc
----folder1
------you.jpg

现在你必须将所有.jpg文件移动到文件夹“photos”并在那里创建“folder1”并移动文件“you.jpg”

这就是我所拥有的,但它似乎只从“下载文件夹”中移动文件

private void move(String suffix, String sourcePath, String destination) throws IOException{
    File dir = new File(sourcePath);
    File destDir = new File(destination);
    String src;
    String dst;

    for (File f : dir.listFiles(new ExtensionFilter(suffix))){
        String name = f.getName();
        src = f.getAbsolutePath();
        dst = destination + "\\" + name;
        Files.createDirectories(Paths.get(destination));
        Files.move(Paths.get(src), Paths.get(dst));
        logs.add("MV;" + src + ";" + dst);
    }

    for (File f : dir.listFiles(new DirectoryFilter())){
        move(suffix, f.getPath(), destination + "\\" + f.getName());    
    }
}

logs只是用于保存日志的ArrayList,已经移动了哪些文件

2 个答案:

答案 0 :(得分:1)

尝试使用Apache Commons IO中的FileUtils。这是最简单的方法。

答案 1 :(得分:1)

使用Java NIO.2 API与Java 8结合使用可能会容易得多。

Java 8引入了方法Files.walk(path),它以递归方式返回给定路径下所有路径的Stream:

  

通过遍历以给定起始文件为根的文件树,返回延迟填充Stream的{​​{1}}。

建议的解决方案可能如下:

Path

此代码创建目标路径。然后它从源路径开始走,并仅过滤以给定后缀结尾的路径。最后,对于他们每个人:

  • source.relativize(p)返回从源到此路径的相对路径。

      

    例如,在UNIX上,如果此路径为“/ a / b”且给定路径为“/ a / b / c / d”,则生成的相对路径将为“c / d”。

    因此,这将返回源下路径的一部分,以便我们可以将其复制到目标路径中。

  • destination.resolve(other)返回通过将此路径附加到其他路径而构造的路径:
      

    在最简单的情况下,[...],在这种情况下,此方法连接到此路径的给定路径,并返回以给定路径结束的结果路径。

  • 所以现在,我们有效地拥有完整的目标路径。我们首先需要使用Files.createDirectories(dir)创建父目录。 dest.getParent()返回父路径,也就是说,它从路径中删除文件名。最后一步是使用Files.move(source, target)将源路径移动到目标路径。

如果你还不能升级到Java 8并继续使用Java 7,你仍然可以使用Files.walkFileTree而不是private void move(String suffix, Path source, Path destination) throws IOException { Files.createDirectories(destination); Files.walk(source) .filter(p -> p.toString().endsWith(suffix)) .forEach(p -> { Path dest = destination.resolve(source.relativize(p)); try { Files.createDirectories(dest.getParent()); Files.move(p, dest); } catch (IOException e) { throw new UncheckedIOException(e); } }); } (代码的其余部分需要调整,但想法是一样的)。