Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-在文件系统中移动文件_Java_Io_Filesystems - Fatal编程技术网

Java-在文件系统中移动文件

Java-在文件系统中移动文件,java,io,filesystems,Java,Io,Filesystems,我正在做学校作业,我们正在做一个简单的文件管理器,可以将所有后缀为“jpg”(例如)的文件移动到另一个文件夹中。问题是,我们应该通过所有文件夹递归地执行此操作 示例:您在“下载”文件夹中: 现在,您必须将所有.jpg文件移动到文件夹“photos”中,并在其中创建“folder1”,同时移动文件“you.jpg” 这是我所拥有的,但它似乎只从“下载文件夹”中移动文件 logs只是一个ArrayList,用于保存已移动文件的日志请尝试使用Apache Commons IO。这是最简单的方法。尝试使

我正在做学校作业,我们正在做一个简单的文件管理器,可以将所有后缀为
“jpg”
(例如)的文件移动到另一个文件夹中。问题是,我们应该通过所有文件夹递归地执行此操作

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

现在,您必须将所有.jpg文件移动到文件夹“photos”中,并在其中创建“folder1”,同时移动文件“you.jpg”

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


logs只是一个ArrayList,用于保存已移动文件的日志

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

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

与Java 8结合使用时,这可能会容易得多

Java 8引入了递归返回给定路径下所有路径流的方法:

通过遍历以给定起始文件为根的文件树,返回一个
,该流惰性地填充有
路径

建议的解决方案可以是:

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);
             }
         });
}
此代码创建目标路径。然后,它从源路径开始,只过滤以给定后缀结尾的路径。最后,对于其中的每一项:

  • 返回从源到此路径的相对路径

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

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

  • 返回通过将此路径附加到其他路径而构造的路径: 在最简单的情况下,[…],在这种情况下,此方法将给定路径连接到此路径,并返回以给定路径结尾的结果路径

  • 所以现在,我们有效地拥有了完整的目标路径。我们首先需要使用创建父目录。返回父路径,即从路径中删除文件名。最后一步是使用将源路径移动到目标路径


如果您还不能升级到Java 8并继续使用Java 7,您仍然可以使用而不是
Files.walk
(代码的其余部分需要调整,但想法是一样的)。

与Java 8结合使用会更容易

Java 8引入了递归返回给定路径下所有路径流的方法:

通过遍历以给定起始文件为根的文件树,返回一个
,该流惰性地填充有
路径

建议的解决方案可以是:

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);
             }
         });
}
此代码创建目标路径。然后,它从源路径开始,只过滤以给定后缀结尾的路径。最后,对于其中的每一项:

  • 返回从源到此路径的相对路径

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

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

  • 返回通过将此路径附加到其他路径而构造的路径: 在最简单的情况下,[…],在这种情况下,此方法将给定路径连接到此路径,并返回以给定路径结尾的结果路径

  • 所以现在,我们有效地拥有了完整的目标路径。我们首先需要使用创建父目录。返回父路径,即从路径中删除文件名。最后一步是使用将源路径移动到目标路径


如果您还不能升级到Java 8并继续使用Java 7,您仍然可以使用而不是
文件.walk
(其余的代码需要调整,但想法是一样的)。

让我们假设一下,既然这是学校作业,不鼓励他们使用第三方库,也不鼓励他们使用基本Java库让我们假设一下,由于这是学校作业,不鼓励他们使用第三方库,并鼓励他们通过查看和或,如果您不允许使用这些方法,您还可以通过查看
文件
APIStart来查看哪个使用了
文件,或者,如果您不允许使用这些方法,您还可以查看哪个使用了
文件
API
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);
             }
         });
}