如何在JDK7中重命名(不移动)文件?

时间:2009-12-16 12:48:56

标签: java file-io path nio java-7

我对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 */ 
}

6 个答案:

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