Почему File.renameTo не меняется, куда указывает файл? - PullRequest
16 голосов
/ 06 сентября 2011
File oldFile = new File("old");
if (oldFile.renameTo(new File("new"))){
    System.out.println(oldFile.getName());//this prints "old"
}

Я посмотрел на источник openJDK, и там функция renameTo (File dest) выглядит так:

public class File implements Serializable, Comparable<File> {
    static private FileSystem fs = FileSystem.getFileSystem();
    private String path;
    ...
    public boolean renameTo(File dest) {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkWrite(path);
            security.checkWrite(dest.path);
        }
        return fs.rename(this, dest);
    }
    ...
}

Таким образом, переменная пути никогда не изменяетсяПочему это так?Как правильно использовать переименованную переменную File?В настоящее время я делаю это так:

File oldFile = new File("/home/blin/misk/old");
File newFile = new File("/home/blin/misk/new");
if (oldFile.renameTo(newFile)){
    oldFile=newFile;
    System.out.println(oldFile.getName());//this prints "new"
}

Ответы [ 3 ]

14 голосов
/ 06 сентября 2011

Самое простое возможное объяснение состоит в том, что в кавычках Javadoc :

Экземпляры класса File являются неизменными;то есть, после создания абстрактный путь, представленный объектом File, никогда не изменится.

Как уже говорили другие, здесь нет правильного или неправильного.Однако, как только дизайнеры библиотеки сделали вышеуказанный выбор, текущее поведение renameTo стало единственно возможным.

Что касается вашего второго фрагмента кода, я не вижу в нем недостатков.

5 голосов
/ 06 сентября 2011

Файловый объект - это просто имя, он даже не должен существовать. Вызов API renameTo фактически переименовывает файл в файловой системе, но не изменяет объект File, потому что это то, для чего предназначен API. здесь нет правильного или неправильного. дизайнеры API в Sun решили, что в этом есть смысл.

1 голос
/ 06 сентября 2011

С первого взгляда в Файл, он выглядит как неизменный. У него есть некоторые сеттеры, но они работают с реальным файлом в файловой системе, а не с экземпляром File.

Таким образом, переименование без изменения текущего экземпляра остается прежним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...