我正在开发一个应用程序,该应用程序必须在文件上传和验证后重启系统。该文件系统位于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。
答案 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
获得的文件描述符上。