在Java中更新符号链接而不删除

时间:2019-07-10 16:42:19

标签: java symlink java-io

我想知道有什么方法可以在不删除旧符号链接的情况下更新符号链接目标。

我有两个代码,它们同时发生。第一部分是每小时下载一些数据并将其存储在/some/directory中,还将创建指向新下载数据的符号链接/most/recent/data

第二部分将从符号链接/most/recent/data中读取最新数据。

下面是我当前创建符号链接的实现。但是问题是如果我们删除了原始的符号链接,那么如果我们同时读取它,将会引起问题。有什么方法可以在不删除旧符号链接的情况下更新符号链接目标?

private void createSymLink(String symLinkPath, Path basePath) {
    try {
        Files.deleteIfExists(Paths.get(symLinkPath));
        Files.createSymbolicLink(Paths.get(symLinkPath), basePath);
    } catch (IOException e) {
    }
}

我想我刚刚找到了一些可能的解决方案。创建一个tmp符号链接,然后将其移至旧的符号链接。因为move是原子操作,所以符号链接更新也将是原子操作。

private void createSymLink(String symLinkPath, Path basePath) {
    try {
        String tmpLink = "/tmp/tmpdir";
        Files.createSymbolicLink(Paths.get(tmpLink), basePath);
        Files.move(Paths.get(tmpLink), Paths.get(symLinkPath), ATOMIC_MOVE);
    } catch (IOException e) {
    }
}

0 个答案:

没有答案