Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

Как работает Files.move() и быстрое перемещение файлов

Столкнулся с задачей, что нужно переместить файл из директории пользователя во временную директорию программы. Для этой задачи было найдено два метода:
File.renameTo() — стандартный вариант перемещения файлов. Files.move() — более новый вариант перемещения файлов.
В документации у первого метода было слишком много "но" и он мог завершиться без результата, но и без ошибки. Поэтому было решено перейти ко второму варианту. На сколько я понял, если файл находится на том же разделе, что и новое место положение, происходит переименование и это занимает секунду.

Вопроса, фактически, два:
Какой самый устойчивый способ переместить файл на другой раздел и безопасно ли это делать методом move? Как этот способ работает "под капотом" (будет ли какое-то специфическое переименование или файл просто скопируется)?


Ответ

Если посмотреть на реализацию метода move, то мы увидим следующий код
public static Path move(Path source, Path target, CopyOption... options) throws IOException { FileSystemProvider provider = provider(source); if (provider(target) == provider) { // same provider provider.move(source, target, options); } else { // different providers CopyMoveHelper.moveToForeignTarget(source, target, options); } return target; }
Как видно из кода есть два варианта:
Если перенос осуществляется в пределах одного раздела, то происходит перенос файла Если перенос осуществляется на другой раздел, то происходит копирование файла с последующим удалением исходного
/** * Simple move implements as copy+delete for use when source and target are * associated with different providers */ static void moveToForeignTarget(Path source, Path target, CopyOption... options) throws IOException { copyToForeignTarget(source, target, convertMoveToCopyOptions(options)); Files.delete(source); }
Для обеспечения надежности вы можете использовать ключ ATOMIC_MOVE - он гарантирует, что операция перемещения будет произведена атомарно, то есть операция либо выполняется целиком, либо не выполняется вовсе.

Комментариев нет:

Отправить комментарий