我试图写一个程序来读取一个非常大的二进制文件,并试图找到的2个不同的字符串的发生,然后打印模式相匹配的指标。 对于示例的缘故,让我们假设该字符序列是[H,e,l,l,o]
和[H,e,l,l,o, ,W,o,r,l,d]
我能,因为我读的每个字符作为一个字节,然后将其保存在编写这对小的二进制文件Arraylist
。 然后,从开头开始Arraylist
,我比较byte arraylist(byte[] data)
与byte[] pattern
。
我需要找到一种方法做相同的,但不用写在内存中的整个二进制文件进行比较。 这意味着,我应该能够同时读取每个字符(我不应该保存到内存整个二进制文件)进行比较。 假设二进制文件只包含字符。
这是如何的任何建议可以实现吗? 谢谢大家。
谷歌“有限状态机”。
或者,一次读取文件的字节,如果字节只是搜索词的第一个字符不匹配,去到下一个字节。 如果它不匹配,现在你正在寻找的序列中的一个字符。 也就是说,你的状态已经从0了,1。如果你的状态等于(或超过)搜索字符串的长度,你找到了!
留给读者执行/调试。
好像你真正需要的阿霍Corasick字符串匹配算法 。
该算法建立从你的字典中给出的自动机,然后让你找到使用你输入的字符串的单次扫描匹配。
维基百科的文章链接到这个Java实现
这有专门的算法,但让我们第一次尝试一个简单的。
你可以使上飞的比较,总是读取下一个字节后开始。 一旦你这样做,很容易被发现,你不需要记住这是从比你的最长模式中更早任何字节。
所以,你可以只使用一个缓冲区,则只要你的最长模式,提出了新的字节在一端,在另一删除它们。
正如我所说的,还有算法比这更有效,但它是一个良好的开端。
使用FileInputStream
裹着BufferedInputStream
和每个字节进行比较。 保持一个缓冲区,你要寻找的序列的长度,所以你原路返回,如果它不以某种点相匹配。 如果你正在寻找的顺序是太大,可以为您节省偏移并重新打开文件进行读取。
- 与流工作: http://docs.oracle.com/javase/tutorial/essential/io/
- 字符串匹配算法: http://en.wikipedia.org/wiki/String_searching_algorithm
或者,如果你只是想要的东西复制和粘贴你可以看看这太问题 。