java - 检查文件是否已完全写入

标签 java file io filesystems

目前我正在开发一个项目,该项目在其中一个例程中处理源目录中的文件。有一个 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/

相关文章:

c - 如何编写 while 循环以便读取整个文件,而不是只读取一行?

file - 在php中使用multipart/form-data请求发送文件

ruby - 当 shell 有子进程时,为什么 ruby​​ 的 PTY 库无法捕获输入?

c - 用普通 C 将文本文件读入数组

linux - 从扇区中的磁盘读取是原子的吗?

java - 使用 JMX 或 JNDI 列出来自 Jboss 的所有部署

java - 在java中的二维数组中的指定位置插入元素或删除元素

java - 使用 Java 查找简单的 Active Directory 信息

java - 使用 JPA 处理 Spring、Hibernate 中的脏读

java - 无法使用java将内容保存在文本文件中