Java:确保Files.list()仅返回“完整”文件

时间:2018-11-21 15:30:04

标签: java filesystems nio

在我的应用程序中,我观察目录中是否有新文件。

我保留通过Files.list(dir)获取的当前文件数组,依次处理该列表,然后再次使用Files.list()重新加载目录。

虽然我本人从未遇到过此问题,但一位同事告诉我,先前版本的软件还要检查文件是否早于3秒(以(Files.getLastModifiedTime(path) - System.currentTimeMillis()) > 3000计算),因为存在传输不完整的问题(或更好:尚未完全传输)文件进行处理。

我可以假设Files.list()返回的文件已完全复制到我正在查看的目录中吗?

是否有一种更干净的方法来检查文件是否完整? 3秒检查更像是黑客攻击,大小为GB的文件可以通过慢速连接(网络)进行复制,即使经过3秒也可能无法完全传输。

1 个答案:

答案 0 :(得分:0)

如果文件在目录中,则不能假定文件已完成。仍可能存在与另一个正在写入该进程或由于其他原因而持有该锁的进程相关联的锁。

我使用以下方法检查文件是否准备就绪(使用Java 1.8)

public static boolean isFileReady(Path file) {
  try(FileChannel ch = FileChannel.open(file, StandardOpenOption.WRITE, StandardOpenOpption.APPEND); FileLock lock = ch.tryLock()) {
    if (lock == null) return false;
    return true;
  } catch (IOException ex) {
    return false;
  }
}

这将尝试打开要追加的文件(为正常写入而打开将删除其所有内容)并创建一个锁。如果建立了锁定,那么我们可以走了,否则就不行了。