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

时间:2018-09-24 14:12:46

标签: java file synchronization filesystems nio

我正在开发一个应用程序,该应用程序必须在文件上传和验证后重启系统。该文件系统位于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上调用sync的方法,但是我发现的唯一解决方案是:

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

依赖于旧的java.io.File。

2 个答案:

答案 0 :(得分:0)

我会说复制操作取决于您的OS JRE代码,因此,如果要确保在OS级别复制文件,请继续显式调用sync()方法。

答案 1 :(得分:0)

如果您查看Files.copy(...)的源代码,将会发现它没有执行sync()。最后,它将执行输入流到输出流中的复制,该输出流与传递到Files.copy(...)的前两个参数相对应。

此外,FileDescriptor绑定到从中获取它的流。如果您不对此流执行任何I / O操作,除了使用new FileOutputStream(...)创建文件之外,对于fie系统,sync()都将无济于事,就像您的代码一样共享。

因此,我看到要实现您的目标的唯一方法是“还原”到老式的java.io API并自己实现流到流副本。这样一来,您sync()就可以从用于FileOutputStream操作的同一copy获得的文件描述符上。