3

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

  1. 文件的文件名是序列号。我需要按顺序处理每个文件。(最小的数字在前,不保证每个序列号都存在。例如:1,2,5,8,9
  2. 如果启动时文件夹中已经存在文件,我需要直接处理
  3. 我需要保证每个文件只处理一次
  4. 我需要避免读取不完整的文件(仍在复制中)
  5. 服务当然应该是可靠的...

实现这一目标的最常见方法是什么?

我正在使用 Java SE7 和 Spring 4。

我已经看过 Java 7 的 WatchService,但它似乎在启动期间处理已经存在的文件有问题,并避免处理不完整的文件。

4

1 回答 1

2

将评论组装成答案。

Easiest way to parse the files in the correct order is to load the entire directory file listing into an array / list and then sort the list using an appropriate comparator. E.g. Load files with File.list() or File.listFiles().

This is not the most efficient methodology, but for less than 10,000 files should be adequate unless you need faster startup time performance (I can imagine a small lag before processing begins as all of the files are listed).

为避免读取不完整的文件,您应该获取文件的独占锁FileLock(通过 aFileChannel您可以从FileOutputStreamor获取FileInputStream,但是您可能无法从 获取独占锁FileInputStream)。假设正在使用的操作系统支持文件锁定(现代操作系统支持)并且写入文件的应用程序表现良好并持有锁(希望如此),那么一旦您能够获得锁,您就知道文件已完成。

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

于 2015-07-13T17:00:07.530 回答