编辑更详细的答案。
问题是 ...
你写道:
它是按创建时间和 FileObject 中的 fileCreatedTime 字段排序的,我在检测到这个文件时从系统时间获得:
...
thread_1 是硬盘监听器,用于检测创建的新文件。我们在 Java 7 中使用 WatchService api。当另一个程序创建新文件时。... thread_1 检测并获取它并将其放入 PriorityBlockingQueue ex:
- 创建时间和“文件写入完成时间”可能有很大不同。(取决于文件大小)。
例如:
打开文件管理器。开始下载大约 60 mb 的文件。注意创建时间。大约 3 分钟后,看看最后的时间。
要检测新文件,查看创建时间是“将其放入 PriorityBlockingQueue ex :”的错误时刻
thraed_1 必须等到文件写入完成。然后他可以把它放到“一个 PriorityBlockingQueue ex :”
如何检测文件的写入是否完成?
3个不太复杂的选项
- a.) 比较文件已创建和文件就绪时间。
或者
- b.) 观察文件的大小正在稳步增长。如果文件完成,它将停止增长。
或者
- c.) 尝试将其移动到临时文件夹。
你更喜欢什么?
我更喜欢解决方案c。
无法移动为写入而打开的文件。在第3 方程序关闭文件后,它可以被移动。
必要的步骤。
- thread_1 正在监视由3rd 方程序创建的文件。
- thread_1 试图将其移动到 xyztmp 文件夹(每 10 或 20 或 ... 秒)。
- thread_1 在 xyztmp 文件夹中寻找新的传入文件并将其放入 PriorityBlockingQueue ex。
解决方案 b. 更复杂。
thread_1 将传入的文件名和大小放在一个控制数组中以比较 3-5 次。(每 5 秒或更长时间)。
大批
(filenamexyz.dat, size1, size2, size3, ...).
(filenameabc.dat, size1, size2, size3, ...).
(filenamefgh.dat, size1, size2, size3, ...).
....
如果每 5 个比较大小由名称标识的文件相同,则第 3 方程序已完成对该文件的写入。
现在可以将其放入 PriorityBlockingQueue 例如:
让我们一步一步看
我们假设 thread_2 在 list.size 为 2 时启动!
- 3rd 方程序开始一一写入文件。
- 第 3 方程序开始写入 FILE_1。
- thread_1 检测到创建的 FILE_1,将其放入列表中。
- 第 3 方程序完成写入 FILE_1。
- 第 3 方程序开始写入 FILE_2。
- thread_1 检测到创建的 FILE_2,将其放入列表中。
- if(priorityBlockingQueue.size) > 1) 真
- thread_2 从读取和处理列表 FILE_1 中的第一个文件开始。
- 第 3 方程序完成写入 FILE_2。
- 第 3 方程序开始写入 FILE_3。
- thread_1 检测到创建的 FILE_3,将其放入列表中。
- thread_2 完成处理 FILE_1。
- thread_2 从列表 FILE_2 中的下一个文件开始。
- 第 3 方程序完成写入 FILE_4。
- 第 3 方程序开始写入 FILE_5。(FILE_5 大于 FILE_4)。
- thread_1 检测到创建的 FILE_5,将其放入列表中。
- thread_2 完成处理 FILE_3。
- thread_2 从列表 FILE_4 中的下一个文件开始。
- thread_2 完成处理 FILE_4。
- thread_2 从列表 FILE_5 中的下一个文件开始。
- thread_2 完成处理 FILE_5。
- 第 3 方程序完成写入 FILE_5。
如果第 3 方程序写入的文件较大,需要更多时间来写入,并且 thread_2 已完成读取较小的 FILE_4 。
thread_2 将下一个文件从列表中取出 - FILE_5,无论该文件是否已准备好读取。
FILE_5 是第 3 方程序仍在写入的文件。FILE_5 是thread_2 正在读取和处理的文件。thread_2读取的字节只是第3 方程序此时写入的字节。