Как переименовать (не переместить) файл в JDK7? - PullRequest
19 голосов
/ 16 декабря 2009

Я немного запутался со всеми этими новыми классами файлового ввода-вывода в JDK7.

Допустим, у меня есть Path и я хочу переименовать файл, который он представляет. Как мне указать новое имя, когда снова ожидается Path?

Path p = /* path to /home/me/file123 */;
Path name = p.getName(); /* gives me file123 */
name.moveTo(/* what now? */); /* how to rename file123 to file456? */

ПРИМЕЧАНИЕ. Зачем мне нужна JDK7 ? Обработка символических ссылок !

Проблема в том, что я должен делать это с файлами, имена и расположение которых известны во время выполнения. Итак, мне нужен безопасный метод (без исключительных побочных эффектов) для создания нового имени-пути какого-то старого имени-пути.

Path newName(Path oldName, String newNameString){
    /* magic */ 
}

Ответы [ 6 ]

55 голосов
/ 13 ноября 2012

В JDK7 Files.move () предоставляет краткий и краткий синтаксис для переименования файлов:

Path newName(Path oldName, String newNameString) {
    return Files.move(oldName, oldName.resolveSibling(newNameString));
}

Сначала мы получаем путь к новому имени файла, используя Path.resolveSibling () и мы используем Files.move () для фактического переименования.

7 голосов
/ 16 декабря 2009

У вас есть строка пути, и вам нужно создать экземпляр Path. Вы можете сделать это с помощью метода getPath или решить. Вот один из способов:

Path dir = oldFile.getParent();        
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);        
oldFile.moveTo(target); 

Обратите внимание, что он проверяет, является ли parent нулевым (похоже, ваше решение этого не делает).

4 голосов
/ 16 декабря 2009

ОК, после того, как все испробовано, похоже, я нашел правильный метод:

// my helper method
Path newName(Path oldFile, String newNameString){
    // the magic is done by Path.resolve(...)
    return oldFile.getParent().resolve(newNameString);
}

// so, renaming is done by:
oldPath.moveTo(newName(oldFile, "newName"));
1 голос
/ 16 декабря 2009

Если взглянуть на Apache Commons IO , то есть класс с именем FileNameUtils . Это делает массу вещей по сравнению с имена путей к файлам и (среди прочего) будут надежно разделять имена путей и т. д. Я думаю, что это поможет вам продвинуться далеко вперед к тому, что вы хотите.

0 голосов
/ 10 октября 2011

Если вы не можете заставить Java делать то, что вы хотите с Unix, я рекомендую скрипты Python (запускаемые вашей программой Java). Python получил поддержку сценариев Unix, и это не Perl :) Это может показаться вам не изящным, но на самом деле в более крупной программе вы выиграете от использования правильного инструмента для работы.

0 голосов
/ 16 декабря 2009

Если путь назначения идентичен исходному пути за исключением имени файла , он будет переименован, а не перемещен.

Так что для вашего примера путь перемещения должен быть

/home/me/file456
...