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
获得的文件描述符。
我正在开发一个应用程序,该应用程序必须在上传并验证文件后重新启动系统。文件系统在 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(...)
.
此外,FileDescriptor
与获取它的流相关联。如果您不对该流执行任何 I/O 操作,除了使用 new FileOutputStream(...)
创建文件外,fie 系统将不会 sync()
任何操作,就像您分享的代码。
因此,我认为实现您的目标的唯一方法是 "revert" 到老式的 java.io
API 并自己实现流到流的复制。这将允许您 sync()
从用于 copy
操作的同一 FileOutputStream
获得的文件描述符。