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

Как переименовать (не перемещать) файл в JDK7?

Я немного запутался со всеми этими новыми классами файлового ввода-вывода в 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 */ 
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

// 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"));

Ответ 4

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

Ответ 5

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

Итак, для вашего примера путь moveto должен быть

/home/me/file456

Ответ 6

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