我正在寻找创建目录并在目录已存在时抛出错误的方法。目前 Apache Hadoop 的 Filesystem 类具有模拟 mkdir -p 行为的 mkdirs 方法。我正在寻找在 Java 中模拟 mkdir 的 API。
if fs.exists(路径)
抛出 FileAlreadyExistsException("目录存在")
fs.mkdirs(路径)
这可以做到,但容易受到竞争条件的影响。我们是否有任何 API 可以原子地执行此操作。
最佳答案
恐怕不会。您可以使用 rename() 重命名目录,更好地保证它最终是否存在。
您可以通过 hadoop API 在 HDFS/posix 文件系统上自动创建文件;您可以将其用作获取目录树锁定的提示。但是你需要处理锁持有者失效的问题。这就是为什么事情倾向于为此使用 ZK 的原因;它确实提供有保证的原子/唯一 zknode 创建。
FWIW,原子性和文件系统操作有点乱。 HDFS 实际上确实使 mkdirs() 成为原子的,这比 unix 做的更多,尽管这是实现的意外(为了性能而持有锁)。一旦您开始与对象存储对话,您对原子操作和覆盖的所有先入之见都需要重新设置,否则您的代码将被无意中破坏。
关于java - Apache Hadoop API 以原子方式创建唯一目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35436722/