最好 API 在 java 中查看文件夹中的新文件

Best API to watch folder for new files in java

我需要查看特定文件夹中的新文件,每当新文件到达时,我需要对其中一个索引软件执行一些处理和处理后的数据。

我需要做的就是查看文件夹,每当有新文件进来时,我都需要阅读其中的内容。 Flume 假脱机目录看起来很合适,但这是我正在考虑的挑战。

1) 只读取文件一次,不应读取任何已读取的文件。 2) 文件的完整性,例如:如果文件没有被完全复制,假设有 .staging 或 .tmp 文件,我不应该阅读它们。 3)输入文件可以很大,而且是xmls。因此,拆分读取文件对我的事业没有帮助。我需要完整地阅读文件,并处理它们。 4) 由于文件的大小可能很大,flume 似乎对大文件有一些问题。能符合我的要求吗?或者我应该检查任何其他文件观察者。?

能否请您建议执行文件监视的最佳选项。 flume 假脱机是否完成了这一切?

如果您使用的是 Java 7+,请使用 Java 自己的 java.nio.file.WatchService。它是最好的,因为它可以按预期在任何地方工作(Linux 上的一个错误除外)并且不依赖额外的库。

flume我无话可说,生疏

你可以做几件事中的一件。

首先,您可以使用一种名称(例如newfile.copying)将文件复制到目录中,然后在复制完成后将它们重命名为"newfile"。然后在扫描过程中,您只需忽略“*.copying”文件。

您可以在文件加载时监控文件大小,如果文件大小在一段时间(几秒)后没有改变,那么您可以假设文件已完成复制并开始处理。

最后,您应该只需要一个 "done" 目录(在同一驱动器上),并在完成后将文件重命名到该目录。

另一种选择是您可以拥有三个目录:"incoming"、"working"、"done".

文件被复制到 "incoming" 目录中。在开始处理它们之前,将它们重命名为 "working" 目录。最后,您将它从那里移到 "done" 目录中。

这使您能够在系统中断时恢复。您将 "know" 您处理的最后一个文件是什么,您可以重新处理它,或者任何您喜欢的。

重命名选项很重要,因为在同一个文件系统上,它们是原子的。您永远不会在一个目录中有一个文件而在另一个目录中没有文件,或者同时具有一个名称和另一个名称。