我对JDK7中所有这些新的File I / O类感到困惑。
假设我有一个Path
并希望重命名该文件,它代表。
如何再次指定Path
时,如何指定新名称?
Path p = /* path to /home/me/file123 */;
Path name = p.getName(); /* gives me file123 */
name.moveTo(/* what now? */); /* how to rename file123 to file456? */
注意:为什么我需要 JDK7 ?处理符号链接!
问题是:我必须使用文件,在运行时已知名称和位置。所以,我需要的是一个安全方法(没有特殊的副作用)来创建一个新名称-Path的旧名称路径。
Path newName(Path oldName, String newNameString){
/* magic */
}
答案 0 :(得分:54)
在JDK7中,Files.move()提供了一种简短的语法来重命名文件:
Path newName(Path oldName, String newNameString) {
return Files.move(oldName, oldName.resolveSibling(newNameString));
}
首先,我们使用Path.resolveSibling()获取新文件名的路径 我们使用Files.move()进行实际重命名。
答案 1 :(得分:7)
您有一个路径字符串,您需要创建一个Path实例。您可以使用getPath方法执行此操作或解决此问题。这是一种方式:
Path dir = oldFile.getParent();
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);
oldFile.moveTo(target);
请注意,它会检查parent是否为null(看起来您的解决方案不会这样做)。
答案 2 :(得分:4)
好的,在尝试了所有的东西之后,似乎我找到了正确的方法:
// my helper method
Path newName(Path oldFile, String newNameString){
// the magic is done by Path.resolve(...)
return oldFile.getParent().resolve(newNameString);
}
// so, renaming is done by:
oldPath.moveTo(newName(oldFile, "newName"));
答案 3 :(得分:1)
如果您查看Apache Commons IO,则会有一个名为FileNameUtils的课程。这有很多东西。文件路径名称和(以及其他东西)可靠地分割路径名称等等。我认为这应该会让你走得很远。
答案 4 :(得分:0)
如果目标路径与源路径相同(文件名除外),则会重命名而不是移动。
因此,对于您的示例,moveto路径应为
/home/me/file456
答案 5 :(得分:-1)
如果你不能让Java用Unix做你想做的事情,我推荐Python脚本(由你的Java程序运行)。 Python已经获得了对Unix脚本的支持,而且它不是Perl :)这对你来说可能听起来不那么优雅,但实际上在一个更大的程序中,你将从使用正确的工具中受益。