I’m using Windows-7 with java 7 update 6 and found this weird (at least to me) behavior –
I have two files E:\delete1.txt and E:\delete2.txt both are read only files, when I try to delete file like following it gets deleted without any issues –
File file = new File("E:\\delete1.txt");
assertTrue(file.delete());
But when I delete file using nio API like following –
Path path = Paths.get("E:\\delete2.txt");
Files.delete(path);
It throws java.nio.file.AccessDeniedException.
Why different behavior for same operation with old and new nio API?
As discussed here – The issue is that
java.io.Filehas many oddities, on Windows inparticular. In this case it resets the file attributes before it deletes
the file so this is why it does not fail as might be expected. It is
behavior that dates back >10 years and so would be risky to change now.
It has several other oddities like this, just one of the reason why it
wasn’t re-implemented to use the new API.
If we try to delete the file from command window then windows throws the same (Access denied) error but file gets deleted from explorer window. It appears the
File#delete()has a wrong implementation and newFiles#delete(Path)should be preferred instead.