Java: File#reName () успешно переименовывает файл, но объект file по-прежнему ссылается на старое имя

#java

#java

Вопрос:

Я столкнулся со странным поведением Java

 File file = new File("test.txt");
file.reName(new File("test1.txt"));
  

Файл успешно переименован из test.txt в test1.txt , но если я сделаю

 System.out.println(file.getCanonicalPath()); //This return test.txt
  

Ожидается ли это? И каков простой способ решить эту проблему?

Ответ №1:

Да, это ожидаемо. File объекты неизменяемы и просто представляют имя файла.

Вы можете представить это следующим образом: File объект — это ссылка на файл, а не сам файл.

Такое поведение действительно может быть полезным — например, представьте, что вы удаляете предыдущую версию файла, чтобы избежать его перезаписи (т. Е. создать резервную копию). Если вы переименуете foo1.txt в foo1.bak , то исходная File переменная, которая содержала foo1.txt , по-прежнему будет содержать его и может быть использована для открытия FileOutputStream .

Комментарии:

1. Итак, чтобы обновить ссылку на файл, мне нужно File file = new File("test1.txt") снова? Правильно?

2. Вам не следует снова указывать тип, если вы не хотите создать новую переменную. Так что это должно быть file = new File ("test1.txt")

3. (Обратите внимание, File объекты не настолько неизменяемы. Вы можете подклассировать их и переопределить методы, чтобы творить всевозможные злодеяния.)

4. Двусмысленность языка. Объекты, класс которых java.io.File является неизменяемым. Но хороший момент!

Ответ №2:

Я полагаю, что это ожидаемо. Объект File представляет собой абстракцию пути относительно базовой файловой системы. Оно не обязательно должно соответствовать существующему файлу. renameTo Метод перемещает базовый файл, если он существует и если его можно перемещать. Однако это не меняет путь, представленный объектом File.

Комментарии:

1. Итак, чтобы обновить ссылку на файл, мне нужно File file = new File("test1.txt") снова? Правильно?

2. @Harry — да. Как сказал Робин, File экземпляр объекта неизменяем. Если вы хотите объект, который ссылается на перемещенный файл, вам нужно создать новый.