【问题标题】:How do I rename (not move) a file in Java 7?如何在 Java 7 中重命名(不移动)文件?
【发布时间】:2020-04-25 16:36:09
【问题描述】:

我对 JDK7 中所有这些新的文件 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 */ 
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这具有独立于平台的额外好处,不像 moveTo 偶尔会中断。
    【解决方案2】:

    你有一个路径字符串,你需要创建一个 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(看起来您的解决方案不这样做)。

    【讨论】:

      【解决方案3】:

      好的,尝试了一切之后,我似乎找到了正确的方法:

      // 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"));
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 抱歉,我需要符号链接感知 API。所有这些 Apache Commons 的东西充其量都与 Java-5 兼容,但主要是 Java-1.4。
        • 在拆分和重新组装文件名方面是否对您没有帮助,并且您可以使用 Java 7 符号链接感知的东西来实际执行复制/重命名?
        • 良好的符号链接处理功能仅由 JDK7 提供,因为它与操作系统具有低级(二进制级)绑定。
        • 恐怕这种拆分和重组在某些情况下会导致错误。但是等等,我现在正在试验Path.resolve(String name)。我想就是这样。
        【解决方案5】:

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

        所以对于你的例子,moveto 路径应该是

        /home/me/file456
        

        【讨论】:

        • 所以我可以创建一个新的Path?有什么比这更简单的吗: Path newName = Paths.get(name.getParent().toString()+pathSeparator+"newName"); ?
        • 是的,现在的问题是:如何以安全的方式创建这样的路径,以免出现异常情况导致它失败。
        • 我可以尝试描述如何采用原始路径,去掉名称 'file123' 连接 'file456' 并调用 name.moveTo() 但由于我并不真正了解 Java,所以我'我在猜测。我确定的是,只要文件名不同,move 就会变成 rename
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2015-05-01
          • 2013-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          • 1970-01-01
          • 2014-09-26
          • 2018-06-28
          相关资源
          最近更新 更多