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