Самый быстрый способ найти строку в текстовом файле с Java

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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