文件之间的区别#删除(路径)和文件#delete()

Pre*_*raj 14 java file-io nio

我正在使用带有java 7更新6的Windows-7并发现这个奇怪的(至少对我而言)行为 -
我有两个文件E:\delete1.txt并且E:\delete2.txt都是只读文件,当我尝试删除文件时,如果它被删除而没有任何问题 -

File file = new File("E:\\delete1.txt"); 
assertTrue(file.delete());
Run Code Online (Sandbox Code Playgroud)

但是当我使用nio API删除文件时如下 -

Path path = Paths.get("E:\\delete2.txt");
Files.delete(path);
Run Code Online (Sandbox Code Playgroud)

它抛出java.nio.file.AccessDeniedException.

为什么使用旧的和新的nio API进行相同操作的行为不同?

Pre*_*raj 13

正如这里所讨论的那样- 问题是java.io.File在Windows上有许多奇怪之处,特别是在Windows上.在这种情况下,它会在删除文件之前重置文件属性,这就是为什么它不会像预期的那样失败的原因.这种行为的历史可以追溯到10年前,所以现在改变是有风险的.它还有其他一些奇怪的东西,这也是为什么没有重新实现使用新API的原因之一.

如果我们尝试从命令窗口中删除该文件,则Windows会抛出相同的(拒绝访问)错误,但文件会从资源管理器窗口中删除.它似乎File#delete()有一个错误的实现,而新的Files#delete(Path)应该是首选.

  • 是否可以扩展以更具体地解释“File#delete()”的错误? (4认同)