Как переименовать (не переместить) файл в 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 */
}
Решение
У вас есть строка пути, и вам нужно создать экземпляр Path.Вы можете сделать это с помощью метода getPath или разрешения.Вот один из способов:
Path dir = oldFile.getParent();
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);
oldFile.moveTo(target);
Обратите внимание, что он проверяет, имеет ли родительское значение значение null (похоже, ваше решение этого не делает).
Другие советы
В JDK7 Файлы.переместить() предоставляет короткий и лаконичный синтаксис для переименования файлов:
Path newName(Path oldName, String newNameString) {
return Files.move(oldName, oldName.resolveSibling(newNameString));
}
Сначала мы получаем путь к новому имени файла, используя Path.resolveSibling()и мы используем Файлы.переместить() чтобы сделать фактическое переименование.
Хорошо, перепробовав все, кажется, я нашел правильный метод:
// 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"));
Если вы посмотрите на Apache Commons IO есть класс под названием ИмяФайлаУтилс.Это делает массу вещей.имена путей к файлам и (помимо прочего) надежно разделят имена путей и т. д.Я думаю, это поможет вам продвинуться на пути к тому, чего вы хотите.
Если путь назначения идентичен исходному пути кроме имени файла, он будет переименован, а не перемещен.
Итак, для вашего примера путь перемещения должен быть
/home/me/file456
Если вы не можете заставить Java делать с Unix то, что вы хотите, я рекомендую сценарии Python (запускаемые вашей программой Java).Python поддерживает сценарии Unix, а не Perl :) Это может показаться вам неэлегантным, но на самом деле в более крупной программе вы выиграете от использования правильного инструмента для работы.