目前我正在开发一个项目,该项目在其中一个例程中处理源目录中的文件。有一个 Java 进程正在寻找指定的目录并尝试读取和处理文件(如果存在)。文件退出大并由其他第三方进程更新。问题是如何检查文件是否已完全写入?我正在尝试使用 file.length()
但看起来即使写入过程尚未完成,它也会返回实际大小。我觉得解决方案应该依赖于平台。任何帮助将不胜感激。
更新: 这个问题与重复的问题并没有真正的不同,但它的答案是高度评价的工作代码片段。
最佳答案
我得到了解决方案:
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 解决方案对我来说更可取。
附:最初我使用 FileOutputStream
而不是 RandomAccessFile
但它会锁定正在写入的文件。
关于java - 检查文件是否已完全写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11239495/