如何检查文件是否正在写入,以便在java中无缓冲区的情况下等待复制(基本上是音频/视频文件)

如何检查文件是否正在写入,以便在java中无缓冲区的情况下等待复制(基本上是音频/视频文件),java,file,java-8,Java,File,Java 8,我已经试过了 if (!readAttributes.creationTime().equals(readAttributes.lastModifiedTime())) 但在某些情况下,当它结束时,这给了我错误的答案 我正在寻找一种成本效益较低的方法 我知道有些方法代价高昂。 无缓冲区 文件。复制 public static boolean isFileInUse(Path path) { try { LOGGER.info(path.toString(

我已经试过了

if (!readAttributes.creationTime().equals(readAttributes.lastModifiedTime()))
但在某些情况下,当它结束时,这给了我错误的答案 我正在寻找一种成本效益较低的方法

我知道有些方法代价高昂。

无缓冲区

文件。复制

public static boolean isFileInUse(Path path) {
        try {
            LOGGER.info(path.toString());
            BasicFileAttributes readAttributes = Files.readAttributes(path, BasicFileAttributes.class);
            LOGGER.info("File TIME-->>   " + readAttributes.creationTime() + " :: " + readAttributes.lastModifiedTime());
            if (!readAttributes.creationTime().equals(readAttributes.lastModifiedTime()))
                return false;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

如果基础系统具有强制文件锁定,只需打开并锁定文件即可。如果没有,就没有办法检查。此方法中的任何检查都不会阻止另一个进程在该方法返回时打开文件进行写入。如何检查文件是否正在写入,以便我可以等待复制该文件,首先要做的是停止尝试将文件系统视为某种消息队列-它不是消息队列。如果你想要一些可靠的东西,你必须设计一个系统,在这个系统中,发送过程发送某种信号,表明它已经完成了文件的写入。您不能假设文件不再被打开或主动写入,发送过程实际上已完成,文件已完成。例如,发件人可以在文件完成后重命名该文件。但是发送者必须这么做。@霍尔格甚至连锁定方案都不能告诉你发送者是否成功写入了整个文件。诸如“文件已成功传输”之类的事件都是事件。文件系统是基于状态的,没有真正的事件概念。试图在文件系统上强制使用事件框架是错误的。@AndrewHenle当然,你是对的。它能确保的最好的事情是,在您读取数据时,没有人会写入更多的数据。在通常情况下,即使是已经提到的先决条件(“基础系统的文件锁是强制性的”)也不能成立。@JaskaranSingh如果您想完全可靠,您需要某种方式让发送方自动发出信号,表明文件已完全成功写入。例如,从
文件名重命名。将
写入
文件名是一种方法。这种重命名之所以有效,是因为在大多数当前文件系统中,它们是一种原子操作。另一种方法是,当
filename
完成时,发送方创建一个空的
filename.done
文件。发送方可以将文件从
inwork
目录移动到
done
目录-如果两个目录位于同一文件系统中,则此类移动也是原子的。