java:如何在大文件中搜索字符串?

时间:2012-02-08 15:02:50

标签: java file io

  

可能重复:
  exception while Read very large file > 300 MB

现在,我想从一个大文件中搜索一个字符串(> = 300M)。因为文件很大所以我无法将其加载到内存中。

可以提供哪种方法来解决这个问题?

由于

2 个答案:

答案 0 :(得分:1)

有几个选择:

  1. 根据您的目标操作系统,您可以将此任务移交给系统实用程序,例如grep(已针对此类工作进行了优化)并简单地解析输出。
  2. 即使文件小到足以包含在内存中,您也必须从磁盘中读取它。因此,您可以简单地读取它,一次一行,并在读取时将字符串与内容进行比较。如果您的应用只需要在目标文件中找到第一个出现的字符串,那么这样做的好处是,如果目标字符串出现在文件的早期,则您只需要读取整个文件找到文件前半部分的内容。
  3. 除非您对应用程序的内存使用量有一个上限(即它必须绝对适合128 MB的内存等),否则您还可以增加启动应用程序时JVM占用的RAM量。但是,由于效率低下(就时间和磁盘I / O而言,如#2中所指出的),无论文件大小如何,这都不太可能是你想要采用的过程。

答案 1 :(得分:1)

我会记忆地映射文件。无论文件大小(最大2 GB)如何,这都不会使用太多堆(<1 KB),并且在大多数系统上大约需要10 ms。

FileChannel ch = new FileInputStream(fileName).getChannel();
MappedByteBuffer mbb = ch.map(ch.MapMode.READ_ONLY, 0L, ch.size());

如果您至少有4 KB空闲(并且您的文件长度小于2 GB)

,则此工作正常