Самый быстрый способ найти строку в текстовом файле с 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();