java.nio.file.Files.copy 是否在文件系统上调用 sync()?

Does java.nio.file.Files.copy call sync() on the file system?

我正在开发一个应用程序,该应用程序必须在上传并验证文件后重新启动系统。文件系统在 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;
    }
}

我试图找到一种在 nio 包中的 fs 上调用同步的方法,但我找到的唯一解决方案是:

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

依赖于旧的 java.io.File .

我会说复制操作取决于你的OS JRE代码,所以如果你想确定文件复制在OS级别,继续显式调用sync( ) 方法。

如果您查看 Files.copy(...) 的源代码,您会发现它没有执行 sync()。最后,它会将输入流复制到与传递给 Files.copy(...).

的前 2 个参数相对应的输出流中

此外,FileDescriptor 与获取它的流相关联。如果您不对该流执行任何 I/O 操作,除了使用 new FileOutputStream(...) 创建文件外,fie 系统将不会 sync() 任何操作,就像您分享的代码。

因此,我认为实现您的目标的唯一方法是 "revert" 到老式的 java.io API 并自己实现流到流的复制。这将允许您 sync() 从用于 copy 操作的同一 FileOutputStream 获得的文件描述符。