以原子方式移动并重命名Path实例

4
给定一个 Path path 实例,我有以下问题:
  1. 如何重命名所指向的文件,而不必使用旧的 File API(如果可能的话),但我还没有在任何地方找到它?

  2. 是否可以同时原子地将物理文件移动到新目录并重命名它?

我正在使用 Java 8,Path 类中的新功能确实已添加,但不确定它们是否有助于回答此问题。

你可以使用 Files.move 来移动文件。如果你有一个目录,这会变得非常棘手,因为有很多原因。 - Boris the Spider
2个回答

7

关于你的第一个问题,自Java 7以来,你可以使用Files#move方法:

Files.move(path, targetPath);

如果您需要原子性,可以使用ATOMIC_MOVE选项:
import static java.nio.file.StandardCopyOption.ATOMIC_MOVE;

Files.move(path, targetPath, ATOMIC_MOVE);

请注意:

  • 如果选项无法支持(例如将文件从本地硬盘移动到网络位置),则此操作可能失败并引发 AtomicMoveNotSupportedException 异常。
  • 如果使用了 REPLACE_EXISTING 选项,则该选项将被忽略;如果目标文件已存在,则实现特定的方式会替换现有文件,或是通过抛出 IOException 来使方法失败。

是否也可以指定扩展名保持不变? - skiwi
@skiwi 扩展名?路径根本没有扩展名的概念。 - fge
@skiwi 我不确定我理解了 - 你可以按照你想要的方式操作:Files.move(Paths.get("someFile.someExtension"), Paths.get("otherFile.sameOrDifferentExtension"); - assylias
注意:可能值得讨论 Path.relativize()Path.resolve()。但是(这非常重要),如果这两个 Path 来自不同的 FileSystem,则这两个操作将无法工作:在这种情况下,它会抛出一个 ProviderMismatchException(未经检查!!)。 - fge
1
@skiwi,再次强调,扩展名这种东西不存在;一个名称就是一个名称。foo.txt.bar.whatever.meh 就是一个名称。 - fge
显示剩余6条评论

1
移动和重命名文件本质上是相同的操作,因此您需要使用 Files.move(Path source, Path target, CopyOption... options)

将文件移动或重命名为目标文件。

如果要强制执行原子移动操作,则使用 StandardCopyOption.ATOMIC_MOVE 复制选项会导致以下情况:

该操作作为原子文件系统操作执行,所有其他选项都将被忽略。如果目标文件已存在,则根据实现情况确定是替换现有文件还是通过抛出IOException方法失败。如果无法将移动操作作为原子文件系统操作执行,则会抛出AtomicMoveNotSupportedException异常。例如,当目标位置位于不同的FileStore上并且需要复制文件,或者目标位置与此对象关联的提供程序不同时,就会出现这种情况。

是的,很抱歉。JavaDoc链接是正确的,但文字描述是错误的 :-( - Edd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接