【问题标题】:Java - Moving files within filesystemJava - 在文件系统中移动文件
【发布时间】:2023-04-06 02:03:01
【问题描述】:

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

示例:您位于“下载”文件夹中:

--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 用来保存记录哪些文件被移动了

【问题讨论】:

标签: java io filesystems


【解决方案1】:

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

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

通过遍历以给定起始文件为根的文件树,返回一个由Path 惰性填充的Stream

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

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);
             }
         });
}

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

  • 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 而不是 Files.walk(其余代码需要调整,但思路相同)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 让我们假设一下,由于这是学校作业,因此不鼓励他们使用 3rd 方库,并鼓励他们使用基本的 Java 库
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多