如何在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 :)这对你来说听起来不太优雅,但实际上在一个更大的程序中,你将从使用正确的工具中受益。