Вопрос

Меня немного смущают все эти новые классы файлового ввода-вывода в 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 :) Это может показаться вам неэлегантным, но на самом деле в более крупной программе вы выиграете от использования правильного инструмента для работы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top