我的Java程序需要在服务器上同步移动文件,即。在同一组本地文件系统中。显而易见的解决方案是使用Files.move()。但是,在某些情况下,我已经读过,例如。跨文件系统,移动将回退到复制和删除。当我移动大文件时,我希望能够在副本发布时向用户报告进度(因为会有明显的延迟)。
但是,我找不到使用Java API执行此操作的简单方法。我可能会编写自己的报告进度的复制例程,但是我需要知道移动是否会产生副本。
一种可能性似乎是:
try {
Files.move(src, dest, CopyOption.ATOMIC_MOVE);
} catch (AtomicMoveNotSupportedException e) {
// Perform a copy instead (and report progress)
}
然而,如果在所有情况下这都是正确的,我不清楚Java doco。这确实是一个正确的解决方案?如果没有,还有另一种方式吗?
答案 0 :(得分:8)
是的,你的解决方案很好。
虽然实际上并不是更改的文件系统会移动到副本中。某些操作原子操作是在同一物理设备上发生的操作,这意味着Files.move(..,..,CopyOption.ATOMIC_MOVE)
将始终成功,除非您复制到另一个驱动器或某些文件系统或操作系统原因不支持原子操作。这意味着您可以使用/dev/sda/
和/dev/sdb
,ext4
文件系统,并且您无法执行从一个到另一个的原子移动。