Подтвердить что ты не робот

Разница между файлами # delete (Путь) и File # delete()

Я использую Windows-7 с обновлением java 7 6 и нашел это странное (по крайней мере для меня) поведение -
У меня есть два файла E:\delete1.txt и E:\delete2.txt как файлы только для чтения, когда я пытаюсь удалить файл, как следующий, он удаляется без каких-либо проблем -

File file = new File("E:\\delete1.txt"); 
assertTrue(file.delete());

Но когда я удаляю файл, используя API-интерфейс nio, как показано ниже -

Path path = Paths.get("E:\\delete2.txt");
Files.delete(path);

Он выбрасывает java.nio.file.AccessDeniedException.

Почему различное поведение для той же операции со старым и новым API-интерфейсом nio?

4b9b3361

Ответ 1

Как обсуждалось здесь - Проблема в том, что java.io.File имеет много странностей, в Windows в конкретный. В этом случае он сбрасывает атрибуты файла перед удалением файл, поэтому он не терпит неудачу, как можно было бы ожидать. это поведение, которое датируется более 10 лет, и поэтому было бы рискованно меняться сейчас. У этого есть несколько других странностей, подобных этому, только одна из причин, почему это не было реализовано повторно для использования нового API.

Если мы попытаемся удалить файл из окна командной строки, то окна выкидывают ту же ошибку (Access denied), но файл удаляется из окна проводника. Похоже, что File#delete() имеет неправильную реализацию, и вместо этого следует использовать новый Files#delete(Path).

Ответ 2

Почему различное поведение для той же операции со старым и новым API-интерфейсом nio?

Поскольку именно эмулирование поведения старого API для подобных операций, по-видимому, не считалось важной целью при разработке нового API. Учитывая, что основной целью API nio filesystem было представить новый API с некоторыми совершенно разными базовыми концепциями и множеством новых возможностей, мне кажется, это нормально.