检查文件是否完全写入

2022-09-01 17:12:53

目前,我正在处理在其中一个例程中处理源目录中的文件的项目。有一个 Java 进程正在查找指定的目录,并尝试读取和处理文件(如果存在)。文件退出大,并由其他第三方进程更新。问题是我如何检查文件是否完全写入?我正在尝试使用,但看起来即使编写过程尚未完成,它也会返回实际大小。我有一种感觉,解决方案应该依赖于平台。任何帮助将不胜感激。file.length()

更新:这个问题与重复的问题没有什么不同,但它有一个高度评价的工作代码片段的答案。


答案 1

我得到了解决方案的工作原理:

private boolean isCompletelyWritten(File file) {
    RandomAccessFile stream = null;
    try {
        stream = new RandomAccessFile(file, "rw");
        return true;
    } catch (Exception e) {
        log.info("Skipping file " + file.getName() + " for this iteration due it's not completely written");
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                log.error("Exception during closing file " + file.getName());
            }
        }
    }
    return false;
}

感谢@cklab和@Will以及所有其他建议以“独家锁定”方式寻找的人。我只是在这里发布代码,让其他人对人们使用它感兴趣。我相信@tigran建议的重命名解决方案也可以工作,但纯Java解决方案对我来说更可取。

附言:最初我用而不是,但它锁定了正在写入的文件。FileOutputStreamRandomAccessFile


答案 2

创建进程在完成写入时是否关闭文件?如果是这样,如果生产者进程仍在生产,则尝试使用独占锁在使用者进程中打开文件将失败。