21

我正在使用带有 java 7 update 6 的 Windows-7 并发现这种奇怪的(至少对我而言)行为 -
我有两个文件E:\delete1.txt,而且E:\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 进行相同的操作会有不同的行为?

4

2 回答 2

22

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

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

于 2012-09-02T07:42:12.697 回答
2

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

因为在新 API 的设计中,为类似操作精确模拟旧 API 的行为显然不是一个重要目标。鉴于 nio 文件系统 API 的主要目标是提供一个具有一些完全不同的底层概念和许多新功能的API,这对我来说似乎很正常。

于 2012-08-27T10:33:49.697 回答