在Java中搜索非常长的String中的表达式

Ann*_*ish 0 java string

我的字符串包含50 MB的文本文件.我得到了这样的字符串:

RandomAccessFile file = new RandomAccessFile("wiki.txt", "r");
FileChannel channel = file.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, 1024*50);
byte[] b = new byte[1024*50];
buffer.get(b);
String wiki = new String(b);
Run Code Online (Sandbox Code Playgroud)

我得到一个可以包含多个单词的String表达式,如果这个表达式在我的wiki String(大字符串)中,我需要返回一个答案.该动作适用于大约1%的String(从String的开头),当我正在寻找的短语位于String的中间或末尾时,我得到的以下代码的答案是假的:

System.out.println(wiki.contains(strToCheck));
System.out.println(wiki.indexOf(strToCheck, 0));
System.out.println(wiki.matches("(?i).*"+strToCheck+".*"));
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?或者我做错了什么?

谢谢.

Ale*_*exR 5

我很遗憾地说,但不是50M,而是1024*50.它是50K.您似乎正在阅读文件的0.1%然后在其中搜索.

  • 50*1024*1024.但请不要这样做!不要将50M读入RAM.读取chunk-by-chunk文件.使用BufferedReader,迭代它,逐行读取并搜索它.但是这个解决方案不支持多行字符串.您还可以使用NIO:FileChannel和CharBuffer.注意CharBuffer实现CharSequence和`Pattern.matcher()`也接受`CharSequence`,这样你就可以直接匹配文件内容而不创建字符串. (3认同)