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