2012-08-27 65 views
12

我使用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相同的操作?

+0

,如果你交換文件,您要刪除周圍即'NIO' API刪除'delete1.txt'和舊的API'File'刪除'delete2.txt'會發生什麼? –

+0

nio調用在任何情況下都會失敗。 – Premraj

+2

@MichaelBorgwardt爲什麼很奇怪?他只是想刪除文件(這恰好是隻讀) – assylias

回答

10

正如討論here - 問題是,java.io.File有很多古怪,在Windows中 特別。在這種情況下,它會在文件刪除文件 之前重置文件屬性,所以這就是爲什麼它不會像預期的那樣失敗。這是 行爲,其歷史可以追溯到10年以上,因此現在改變是有風險的。 它還有其他幾個古怪的東西,就是它沒有重新實現以使用新API的原因之一。

如果我們試圖刪除命令窗口中的文件,然後拋出窗口相同(拒絕訪問)錯誤,但文件會從資源管理器窗口中刪除。看起來File#delete()有一個錯誤的實現,而新的Files#delete(Path)應該是首選。

+0

這可以擴展來更具體地解釋什麼'File#delete()'做錯了? – ZX9

0

爲什麼不同的行爲與新老NIO API相同的操作?

因爲在類似操作中完全模擬舊API的行爲顯然不被認爲是設計新API的重要目標。鑑於nio文件系統API的主要目標是提供一個新的 API,它具有一些完全不同的底層概念和很多新功能,對我來說這似乎很正常。