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

在Java中检查匹配文件的有效方法,java,file,filenames,processing-efficiency,Java,File,Filenames,Processing Efficiency,我不是Java专家,但我正在制作的程序将处理高吞吐量。所以我想我应该做一点众包来征求意见。情况是这样的 java进程将监视要处理的文件的目录,这些文件将配对(要存储的数据文件和要编目的带有元信息的xml文件)。所以我需要得到当前文件的列表,检查所需的双胞胎,然后处理 文件将始终具有匹配的文件名,并且仅因文件扩展名不同而不同,例如。 filename1.jpg filename1.xml filename2.jpg filename2.xml 到目前为止,我有三个选择 将FilenameFilte

我不是Java专家,但我正在制作的程序将处理高吞吐量。所以我想我应该做一点众包来征求意见。情况是这样的

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

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

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

  • 将FilenameFilter与File.List(FilenameFilter)调用一起使用,以检查具有文件名的文件总数是否大于1

  • 使用两个FileNameFilter生成包含.xml和不包含.xml的文件列表,将非xml文件列表转换为ArrayList并调用Collections.binarySearch()

  • 生成不带.xml扩展名的所有文件的列表,将此列表用作密钥/值对哈希映射的密钥,该哈希映射基于文件名采用.xml文件。然后在处理之前,运行哈希列表并检查是否存在.xml twin

  • 有什么想法吗

    编辑/评论

    在查看了这些建议并进行了修补之后,我现在将使用两个FileNameFilter,一个列出XML文件,另一个不列出。XML文件列表将从XML扩展名中剥离并转储到哈希中。然后遍历数据文件列表,调用hashlist.contains()以查看哈希集中是否存在匹配项,然后再继续


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

    获取所有文件,对它们进行排序,然后对文件名进行线性传递,查看前缀是否一致。显然,它们应该在排序列表中紧靠在一起

    这应该比过滤器和hashmaps简单得多,速度也快得多


    要监视目录,可能需要在可用时使用通知基础API,如inotify。然后,当文件夹内容发生更改时,操作系统将发出信号。

    获取所有文件,对其进行排序,然后对文件名进行线性传递,查看前缀是否一致。显然,它们应该在排序列表中紧靠在一起

    这应该比过滤器和hashmaps简单得多,速度也快得多


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

    这有点离题,但鉴于所述意图,我希望能够在这里发布足够相关的内容

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

    如果你有高吞吐量,那么如果你允许,这种情况将会发生。即使在处理之前短暂地延迟,它也可能迟早会发生

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


    如果您的部分交付的文件位于同一文件夹中,仅使用备用文件扩展名重命名,这可能会影响此问题中提到的一些选项。这有点离题,但鉴于所述意图,我希望与在此发布足够相关

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

    如果你有高吞吐量,那么如果你允许,这种情况将会发生。即使在处理之前短暂地延迟,它也可能迟早会发生

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


    如果您的部分交付的文件位于同一文件夹中,并且仅使用备用文件扩展名重命名,那么这一点也许值得一提,这可能会对这个问题提到的一些选项产生影响。

    我的假设是,由于这些文件是新写的,所以在完成写入之前,操作系统不会将文件显示为现有文件。也就是说,当对目录中的新文件进行复制/写入时,任何未执行该写入的进程在查询目录中的当前文件时都无法看到该文件。如果我错了,请纠正我。实际上,我知道的任何操作系统都会在文件创建时开始显示文件,而不是在文件关闭(完成编写)时。这就是为什么最好的做法是写入临时文件(或临时文件夹),然后在完成后将文件移动到最终名称。我假设,由于这些文件是新写入的,所以在写入之前,操作系统不会将文件显示为现有文件