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

java:如何在大文件中搜索字符串?,java,file,io,Java,File,Io,可能重复: 现在,我想从一个大文件(>=300M)中搜索一个字符串。因为文件很大,所以我无法将其加载到内存中 可以提供什么样的方法来处理这个问题 谢谢有几个选项: 根据您的目标操作系统,您可能能够将此任务交给系统实用程序,例如(已经针对此类工作进行了优化),然后简单地解析输出 即使文件足够小,可以包含在内存中,您也必须以任何方式从磁盘读取它。因此,您只需一行一行地读入,并在读取内容时将字符串与内容进行比较。如果您的应用程序只需要在目标文件中查找字符串的第一个出现位置,这样做的好处是,如果目标字

可能重复:

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

可以提供什么样的方法来处理这个问题


谢谢

有几个选项:

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

  • 我会用内存映射文件。无论文件大小如何(高达2GB),这都不会使用太多堆(<1KB),在大多数系统上大约需要10ms

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

    如果您至少有4KB的可用空间(并且您的文件长度小于2GB),则此功能可以正常工作。

    另请参见,好的一点是由操作系统来确定主内存(在后台)中有多少可用空间您可以像一切都立即可用一样编写代码,而不必担心有多少可用内存或不再需要哪些页面。