Java.nio.file.Files.copy вызывает sync () в файловой системе? - PullRequest
0 голосов
/ 24 сентября 2018

Я разрабатываю приложение, которое должно перезагрузить систему после того, как файл был загружен и проверен.Файловая система находится на SD-карте, поэтому ее необходимо синхронизировать, чтобы убедиться, что загруженный файл действительно был сохранен на устройстве.

Мне было интересно, выполняет ли синхронизация файл java.io.file.Files.copy.или нет.

Мой код работает так:

public int save(MultipartFile multipart) throws IOException {

    Files.copy(multipart.getInputStream(), file, standardCopyOption.REPLACE_EXISTING);

    if (validate(file)) {
        sync(file); <-- is it useless?
        reboot();
        return 0;
    } else {
        Files.delete(file);
        return -1;
    }
}

Я пытался найти способ вызвать синхронизацию на fs в пакете nio, но единственное решение, которое я нашелis:

public void sync(Path file) {
    final FileOutputStream fos = new FileOutputStream(file.toFile());
    final FileDescriptor fd = fos.getFD();
    fd.sync();
}

, который опирается на старый файл java.io.File.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Если вы посмотрите на исходный код для Files.copy(...), вы увидите, что он не выполняет sync().В конце он выполнит копирование входного потока в выходной поток, соответствующий первым 2 аргументам, переданным Files.copy(...).

Кроме того, FileDescriptor привязан к потоку, из которого онполучен.Если вы не выполняете никаких операций ввода-вывода с этим потоком, кроме создания файла с new FileOutputStream(...), в системе fie не будет ничего для sync(), как в случае с кодом, которым вы поделились.

Таким образом, единственный способ достичь вашей цели - это вернуться к старомодному java.io API и самостоятельно выполнить потоковое копирование.Это позволит вам sync() в дескрипторе файла, полученном из того же FileOutputStream, который используется для операции copy.

0 голосов
/ 24 сентября 2018

Я скажу, что операция копирования зависит от кода JRE вашей ОС, поэтому, если вы хотите быть уверенным в файле Copy на уровне ОС, продолжайте явно вызывать метод sync ().

...