#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
экземпляр объекта неизменяем. Если вы хотите объект, который ссылается на перемещенный файл, вам нужно создать новый.