在Java中检查匹配文件的有效方法

时间:2012-05-17 16:57:17

标签: java file filenames processing-efficiency

我不是Java专家,但我正在制作的程序将处理高吞吐量。所以我想我会做一些人群寻求意见。这是情况。

java进程将在目录中查看要处理的文件,这些文件将被配对(要存储的数据文件和带有要编目的元信息的xml文件)。所以我需要获取当前文件列表,检查所需的双胞胎,然后处理。

文件将始终具有匹配的文件名,并且仅因文件扩展名而异,例如 filename1.jpg filename1.xml filename2.jpg filename2.xml

到目前为止,我有三个选择。

  1. 使用FilenameFilter和File.List(FileNamefilter)调用来检查文件名的总文件是否大于1.

  2. 使用两个文件名过滤器生成.xml且没有.xml的文件列表,将非XML文件列表转换为ArrayList并调用Collections.binarySearch()。

  3. 生成没有.xml扩展名的所有文件的列表,使用此列表作为键/值对的散列映射的键,该键/值对假定基于文件名的.xml文件。然后运行哈希列表并在处理之前检查.xml双胞胎是否存在。

  4. 有什么想法吗?

    EDITS /评论

    在查看建议并修改后,我现在要使用两个FilenameFilters,一个列出XML文件,一个不列出。 XML文件列表被剥离了xml扩展名并转储到哈希中。然后迭代数据文件列表,在继续之前调用hashlist.contains()以查看hashset中是否存在匹配。

    如下所述,存在处理不完整文件的问题。正如我在评论中所说,我认为在写入完成之前,新写入的文件对于非写入进程是不可见的(新文件,不能打开进行编辑)

2 个答案:

答案 0 :(得分:3)

获取所有文件,排序,然后对文件名称进行线性传递,并查看哪些文件符合前缀。显然,它们应该在排序列表中彼此相邻。

这应该比过滤器和哈希映射更简单,更快!

要监视目录,您可能希望在可用时使用通知基础API,例如inotify。然后操作系统将在文件夹内容发生变化时发出信号。

答案 1 :(得分:0)

这有点偏离主题,但我希望在这里发表充分相关的内容,考虑到所说的意图。

问题没有说明文件如何到达目录。如果他们通过网络或互联网进入,或者从另一个进程流入,则传递可能不是即时的,导致选择和处理尚未完全传递的文件的风险,例如,一半的jpeg文件。

如果您拥有高吞吐量,那么如果您允许,则会出现这种情况。即使您在处理之前暂时延迟,它仍可能以某种方式迟早会发生。

处理此问题的常见策略是传递到中间文件名(或更好的是,相邻文件夹)。传递完成后,传递过程将重命名或将文件移动到其正确的名称和位置。这一举动实际上是即时的(原子的)。在ftp的情况下,至少一个众所周知的工具会自动执行这些步骤。

它的主题可能是提及如果您的部分传递的文件位于同一文件夹中,仅使用备用文件扩展名重命名,这可能会影响此问题中提到的一些选项。