22

我对 JDK7 中所有这些新的文件 I/O 类有点困惑。

假设,我有一个Path并且想要重命名它所代表的文件。当再次需要 a 时,如何指定新名称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 */ 
}
4

6 回答 6

61

在 JDK7 中,Files.move()为重命名文件提供了一种简洁的语法:

Path newName(Path oldName, String newNameString) {
    return Files.move(oldName, oldName.resolveSibling(newNameString));
}

首先,我们使用Path.resolveSibling()获取新文件名的路径, 然后使用Files.move()进行实际重命名。

于 2012-11-13T15:23:12.773 回答
9

您有一个路径字符串,您需要创建一个 Path 实例。您可以使用 getPath 方法或解析来执行此操作。这是一种方法:

Path dir = oldFile.getParent();        
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);        
oldFile.moveTo(target); 

请注意,它会检查 parent 是否为空(看起来您的解决方案不这样做)。

于 2009-12-16T13:29:24.313 回答
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"));
于 2009-12-16T13:21:04.330 回答
1

如果您看一下Apache Commons IO,就会有一个名为FileNameUtils的类。这做了很多事情。文件路径名,并且将(除其他外)可靠地拆分路径名等。我认为这应该会让你朝着你想要的方向走很长一段路。

于 2009-12-16T13:04:55.627 回答
0

如果目标路径除了文件名之外与源路径相同,它将被重命名而不是移动。

因此,对于您的示例, moveto 路径应该是

/home/me/file456
于 2009-12-16T12:51:34.577 回答
-2

如果你不能让 Java 用 Unix 做你想做的事,我推荐 Python 脚本(由你的 Java 程序运行)。Python 已获得对 Unix 脚本的支持,它不是 Perl :) 这对您来说可能听起来不优雅,但实际上在一个更大的程序中,您将受益于使用正确的工具来完成这项工作。

于 2011-10-10T01:26:31.380 回答