检查文件是否包含某个字符串或数字的最快方法是什么?
答案 0 :(得分:5)
查看JDK附带的Scanner
类(See official documentation)。您将能够跳过输入的某些部分(在本例中为文本文件)并匹配您的愿望的正则表达式。我不确定这是否是最有效的方式,但果然 - 这很简单。您也可以查看this example,这将有助于您入门。
答案 1 :(得分:2)
未尝试,但可能最快的机制是首先,使用您的搜索键并将其编码为文件。
例如,如果您知道该文件是UTF-8,请将您的密钥从String(UTF-16)编码为UTF-8的字节数组。这很重要,因为通过向下编码到文件表示,您只需对密钥进行编码。另一种方法是使用标准Java Readers - 将文件转换为UTF-16。
现在您有一个正确的密钥(以字节为单位),使用NIO为该文件创建MappedByteBuffer。这会将文件映射到虚拟内存空间。
最后,为字符串搜索实现Boyer-Moore algorithm,使用键的字节对照文件的字节,通过映射区域,
可能有更快的方法,但这解决了在Java中搜索文本文件的大部分问题。它利用VM来避免复制文件的大块,并且它会跳过文件所在的任何编码的转换步骤到Java内部使用的UTF-16。
答案 2 :(得分:0)
答案 3 :(得分:0)
我在MIMEParser中发现的最佳实现: https://github.com/samskivert/ikvm-openjdk/blob/master/build/linux-amd64/impsrc/com/sun/xml/internal/org/jvnet/mimepull/MIMEParser.java
/**
* 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();