什么是检查文件是否包含特定字符串或数字的最快方法?
未经试验,但可能是最快的机制是首先将搜索关键字编码为像文件一样的格式。
例如,如果您知道文件是UTF-8,则需要将关键字从String(它是UTF-16)编码为UTF-8字节数组。这很重要,因为通过向下编码到文件表示,您只编码了关键字。使用标准的Java Readers则相反——将文件转换为UTF-16。
现在,您拥有了一个适当的、以字节为单位的关键字,请使用NIO为文件创建MappedByteBuffer。这将文件映射到虚拟内存空间中。
最后,使用Boyer-Moore算法进行字符串搜索,使用关键字的字节与通过映射区域的文件的字节进行匹配。
可能有更快的方法,但是这种方法解决了在Java中搜索文本文件的大部分问题。它利用虚拟机来避免复制大块的文件,并跳过了将文件转换为UTF-16的转换步骤,而Java在内部使用UTF-16。
/**
* Finds the boundary in the given buffer using Boyer-Moore algo.
* Copied from java.util.regex.Pattern.java
*
* @param mybuf boundary to be searched in this mybuf
* @param off start index in mybuf
* @param len number of bytes in mybuf
*
* @return -1 if there is no match or index where the match starts
*/
private int match(byte[] mybuf, int off, int len) {
还需要:
private void compileBoundaryPattern();