Самый быстрый способ найти строку в текстовом файле с Java - PullRequest
3 голосов
/ 28 марта 2011

Какой самый быстрый способ проверить, содержит ли файл определенную строку или число?

Ответы [ 4 ]

5 голосов
/ 28 марта 2011

Посмотрите на класс Scanner, который поставляется с JDK ( См. Официальную документацию ). Вы сможете пропустить определенные части ввода (в данном случае - текстовый файл) и сравнить с регулярным выражением вашего желания. Я не уверен, что это самый эффективный способ, но, конечно, достаточно просто. Вы также можете взглянуть на этот пример , который поможет вам начать работу.

2 голосов
/ 28 марта 2011

Не проверено, но, вероятно, самый быстрый механизм - сначала взять ключ поиска и закодировать его как файл.

Например, если вы знаете, что это файл UTF-8, возьмите ключ и закодируйте егоиз строки (которая это UTF-16) в байтовый массив, который является UTF-8.Это важно, потому что кодируя до представления файла, вы кодируете только ключ.Использование стандартных Java Readers идет другим путем - конвертирует файл в UTF-16.

Теперь, когда у вас есть правильный ключ, в байтах используйте NIO для создания MappedByteBuffer для файла,Это сопоставляет файл с пространством виртуальной памяти.

Наконец, реализуйте алгоритм Бойера-Мура для поиска строки, используя байты ключа против байтов файла через сопоставленное отображение.region,

Там может быть более быстрый путь, но это решает большую часть проблем с поиском текстового файла в Java.Он использует виртуальную машину, чтобы избежать копирования больших фрагментов файла, и пропускает этап преобразования любой кодировки файла в UTF-16, который Java использует внутри.

0 голосов
/ 01 марта 2015

Лучшая реализация, которую я нашел в 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();
0 голосов
/ 28 марта 2011

Проверьте следующие алгоритмы:

или если вы хотите найти одну из набора строк:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...