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