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

2022-09-02 04:10:53

我正在使用Windows-7与java 7 update 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 的相同操作具有不同的行为?


答案 1

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

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


答案 2

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

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