Maneira mais rápida de encontrar uma string em um arquivo de texto com java

Qual é a maneira mais rápida de verificar se um arquivo contém uma determinada string ou número?

Dê uma olhada na class Scanner , que acompanha o JDK ( consulte a documentação oficial ). Você poderá pular certas partes da input (neste caso – arquivo de texto) e corresponder à expressão regular do seu desejo. Eu não tenho certeza se esta é a maneira mais eficiente, mas com certeza – é bem simples. Você também pode dar uma olhada neste exemplo , que ajudará você a começar.

Não experimentado, mas provavelmente o mecanismo mais rápido é, primeiro, pegar sua chave de busca e codificá-la como o arquivo.

Por exemplo, se você souber que o arquivo é UTF-8, pegue sua chave e codifique-a de uma String (que é UTF-16) em uma matriz de bytes UTF-8. Isso é importante porque, ao codificar a representação do arquivo, você só codifica a chave. Usando o padrão Java Readers vai para o outro lado – converte o arquivo para UTF-16.

Agora que você tem uma chave adequada, em bytes, use o NIO para criar um MappedByteBuffer para o arquivo. Isso mapeia o arquivo para o espaço da memory virtual.

Finalmente, implemente um algoritmo Boyer-Moore para pesquisa de strings, usando os bytes da chave contra os bytes do arquivo através da região mapeada,

Pode muito bem haver uma maneira mais rápida, mas isso resolve uma grande parte dos problemas de pesquisar um arquivo de texto em Java. Ele aproveita a VM para evitar a cópia de grandes partes do arquivo e pula a etapa de conversão de qualquer codificação do arquivo para o UTF-16, que o Java usa internamente.

Confira os seguintes algoritmos:

  • Boyer-Moore
  • Knuth-Morris-Pratt

ou se você quiser encontrar um de um conjunto de strings:

  • Rabin-Karp

A melhor realização que encontrei no 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) { 

Necessário também:

 private void compileBoundaryPattern(); 
    Intereting Posts