用于文件的Java监视文件夹

时间:2015-07-09 21:25:10

标签: java spring file monitor watchservice

我需要监视某个文件夹以查找我需要处理的新文件。 我有以下要求:

  1. 文件的文件名是序列号。我需要按顺序处理每个文件。 (最低编号,不保证每个序列号都存在。例如:1,2,5,8,9
  2. 如果启动期间文件夹中已存在文件,我需要直接处理它们
  3. 我需要保证我只处理每个文件一次
  4. 我需要避免阅读不完整的文件(仍在复制中)
  5. 服务应该是可靠的......
  6. 实现这一目标的最常见方法是什么?

    我正在使用Java SE7和Spring 4.

    我已经看过Java 7的WatchService,但它似乎在启动过程中处理现有文件时出现问题,并避免处理不完整的文件。

1 个答案:

答案 0 :(得分:2)

将评论汇总到答案中。

以正确顺序解析文件的最简单方法是将整个目录文件列表加载到数组/列表中,然后使用适当的比较器对列表进行排序。例如。使用File.list()File.listFiles()加载文件。

这不是最有效的方法,但是对于少于10,000个文件应该是足够的,除非你需要更快的启动时间性能(我可以想象在处理开始之前有一个小的延迟,因为列出了所有文件)。

为了避免阅读不完整的文件,您应该获得一个独家FileLock(通过FileChannel,您可以从FileOutputStreamFileInputStream获取,但是您可能无法从文件的FileInputStream获取独占锁。假设正在使用的操作系统支持文件锁定(现代操作系统这样做),并且编写文件的应用程序表现良好并且保持锁定(希望是这样),那么只要您能够获取锁定,就知道文件已完成。

如果出于某种原因你不能依赖文件锁定那么你需要让编写程序首先写入临时文件(可能使用不同的扩展名),然后原子地移动/重命名文件(对于大多数操作系统,如果在相同的文件系统/分区),或监视文件一段时间,以查看是否正在写入更多字节(不是最强大的方法)。