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

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

 File file = new File("E:\\delete1.txt"); assertTrue(file.delete()); 

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

 Path path = Paths.get("E:\\delete2.txt"); Files.delete(path); 

它抛出java.nio.file.AccessDeniedException

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

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

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

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

因为完全模仿旧API的类似操作的行为显然不被认为是新API设计中的重要目标。 鉴于nio文件系统API的主要目标是提供一个具有一些完全不同的底层概念和许多新function的 API,对我而言似乎很正常。