如何在JDK7中重命名(不移动)文件?
我对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 newName(Path oldName, String newNameString){ /* magic */ }
您有一个路径字符串,您需要创建一个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(看起来您的解决方案不这样做)。
在JDK7中, Files.move()提供了一种简短的语法来重命名文件:
Path newName(Path oldName, String newNameString) { return Files.move(oldName, oldName.resolveSibling(newNameString)); }
首先,我们使用Path.resolveSibling()获取新文件名的路径,然后我们使用Files.move()进行实际重命名。
好吧,在尝试了所有的东西之后,似乎我找到了正确的方法:
// 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"));
如果您看一下Apache Commons IO,就会有一个名为FileNameUtils的类。 这有很多东西。 文件路径名称和将(以及其他东西)可靠地分割路径名称等。我认为这应该让你有很长的路要走你想要的。
如果目标路径与源路径相同(文件名除外) ,则将重命名而不是移动。
所以对于你的例子,moveto路径应该是
/home/me/file456
如果你不能让Java用Unix做你想做的事情,我推荐Python脚本(由你的Java程序运行)。 Python已经获得了对Unix脚本的支持,而且它不是Perl :)这对你来说听起来不太优雅,但实际上在一个更大的程序中,你将从使用正确的工具中受益。