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