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

时间:2012-08-27 09:35:40

标签: java file-io nio

我正在使用带有java 7更新6的Windows-7,并发现这个奇怪的(至少对我而言)行为 -
我有两个文件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进行相同操作的行为不同?

2 个答案:

答案 0 :(得分:13)

正如所讨论的here - 问题是java.io.File在Windows上有许多奇怪之处 特定。在这种情况下,它会在删除之前重置文件属性 该文件所以这就是为什么它不会像预期的那样失败。它是 可以追溯到10年左右的行为,现在就有可能发生变化。 它有其他几个奇怪的东西,这只是其中一个原因 没有重新实施使用新API。

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

答案 1 :(得分:1)

  

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

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