gpt4 book ai didi

java - Ubuntu 上 Java 7 的原子文件移动问题

转载 作者:行者123 更新时间:2023-12-01 04:36:28 26 4
gpt4 key购买 nike

有一些解决方法,但我想提出一个真实的问题。

我有一个外部服务器将文件上传到/upload 文件夹,我正在使用 java.nio.file.Files 原子移动将它们复制到/dest 文件夹,然后处理移动的文件。

问题是,很明显,在调用 nio move 后,源文件尚未刷新到源中,但仍以原子方式执行 move,一旦刷新,它就会刷新到目标移动文件。

操作系统是Ubuntu。伪是:

Path origFilePath = resolveOrigFilePath();
Path targetFilePath = resolveOrigFilePath();

//日志显示源中的空文件,长度= 0

   logger.warn("Atomic move file [{}], can read mode: [{}],can write mode: [{}] source size: [{}]",
origFilePath, origFilePath.toFile().canRead(), origFilePath.toFile().canWrite(), origFilePath
.toFile().length());

//执行文件的原子移动

    Path target = Files.move(origFilePath, targetFilePath, StandardCopyOption.ATOMIC_MOVE);

//日志记录显示空文件已移动并且原始文件不再存在

    logger.warn(
"Atomic moved file [{}] to [{}], target read mode: [{}], target write mode: [{}], target size: [{}], orig target size: [{}], is original exists [{}]",
origFilePath, target, target.toFile().canWrite(), target.toFile().canRead(),
target.toFile().length(), targetPath.toFile().length(), sensorFilePath.toFile().exists());

。。//处理仍为空的目标文件。。//短暂持续时间后,目标文件具有内容,但没有完成对该文件的其他编程访问

。.

知道底层实现的原因是什么吗?

最佳答案

在开始移动文件之前,请确保执行OutputStream.flush(),更重要的是FileDescriptor.sync():

        FileOutputStream out = new FileOutputStream(file, false);

// Write your data here.

out.flush();

FileDescriptor fd = out.getFD();
fd.sync();

out.close();

关于java - Ubuntu 上 Java 7 的原子文件移动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17272418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com