我需要监视某个文件夹中是否有需要处理的新文件。我有以下要求:
- 文件的文件名为序列号。我需要按顺序处理每个文件。(首先是最低的序号,不能保证每个序号都存在。例如:1、2、5、8、9
- 如果启动时文件夹中已经存在文件,我需要直接处理
- 我需要保证我只处理每个文件一次
- 我需要避免读取不完整的文件(仍在复制) 服务当然应该是可靠的…
最常见的方法是什么?
我正在使用Java SE7和Spring 4。
我已经看了一下Java 7的WatchService,但是它似乎在启动时处理已经存在的文件有问题,并且避免处理不完整的文件
将评论汇编成一个答案。
按正确顺序解析文件的最简单方法是将整个目录文件列表加载到数组/列表中,然后使用适当的比较器对列表进行排序。例如加载带有File.list()
或File.listFiles()
的文件。
这不是最有效的方法,但对于少于10,000个文件来说应该足够了,除非您需要更快的启动时间性能(我可以想象在处理开始之前有一个小延迟,因为所有文件都列出了)。
为了避免读取不完整的文件,您应该在文件上获得一个独占的FileLock
(通过FileChannel
,您可以从FileOutputStream
或FileInputStream
中获得,但是您可能无法从FileInputStream
中获得独占锁)。假设正在使用的操作系统支持文件锁定(现代操作系统都支持),并且写文件的应用程序表现良好并持有锁(希望如此),那么一旦您能够获得锁,您就知道文件完成了。
如果由于某种原因您不能依赖文件锁定,那么您要么需要让写入程序首先写入临时文件(可能具有不同的扩展名),然后自动移动/重命名该文件(对于大多数操作系统来说,如果在相同的文件系统/分区上是原子的),或者监视该文件一段时间以查看是否有更多的字节被写入(不是最可靠的方法)。