Files.createSymbolicLink()(java.nio.file)不会覆盖现有的符号链接,也不会抛出异常

时间:2015-10-21 02:58:57

标签: java

基于Java Doc,如果链接已存在,它将抛出FileAlreadyExistsException。但是在实际测试中,当运行跟随两行时,它们都返回“/ tmp / ln1”并且不会抛出任何异常。并且“ln1”仍然指向“/ tmp / dir1”。似乎这种行为不遵循文档。这是一个JDK错误? 有没有办法覆盖旧链接?就像命令行的作用一样: ln -nfs from to

Files.createSymbolicLink(Paths.get("/tmp/ln1"), Paths.get("/tmp/dir1"))

Files.createSymbolicLink(Paths.get("/tmp/ln1"), Paths.get("/tmp/dir2"))

1 个答案:

答案 0 :(得分:3)

我使用的是JDK 1.7。操作系统是Linux。我尝试这两个语句,它根据第一个语句创建一个符号链接,然后抛出一个FileAlreadyExistsException来执行第二个语句。

如果要覆盖旧链接,则应在创建新链接之前删除旧链接,如下所示:

public class Test {
    public static void main(String[] args) throws IOException {
        String link = "/tmp/ln1";
        // create first symbolic link
        deleteIfExists(link);
        Files.createSymbolicLink(Paths.get(link), Paths.get("/tmp/dir1"));
        //create second symbolic link
        deleteIfExists(link);
        Files.createSymbolicLink(Paths.get(link), Paths.get("/tmp/dir2"));
    }

    private static void deleteIfExists(String filePath) {
        File file = new File(filePath);
        if(file.exists()) {
            file.delete();
        }
    }
}