2014-10-29 25 views
0

有论坛帖子,博客文章和问题在Q中&的巨大数额作为(包括本网站1)错误地回答这个问题,并呈现出什么读取文件指应用程序惊人的误解。将文件读入内存并对其进行操作对任意大型文件来说都不是一个合适的解决方案(并且它在文件的性质上是任意大的)。如何在java中的文件中真正找到字符串的位置?

所以现在我正在寻找一个“真正的”解决方案在一个文件中搜索一个字符串,并检索其从流开始计数的位置。为了弄清事情而不生产第19382号无用答案:

  • 文件是一个文件。如果没有相反指定,他们可能会有一些TB大。这意味着将文件读入内存可能会导致应用程序崩溃,并且/或者如果文件大小未得到验证,将导致我的服务停机。阅读有限大小的文件不是(!)我的问题[2]的一部分。
  • 一个字符串是一个字符串。它们可以是任意长度的,尤其是大于在流处理过程中读取文件内容的缓冲区(但不会大于内存)!

AFAIK有没有类在Java JDK 7,尤其是java.util.Scanner不检索结果的位置和需要的位置与java.lang.String.indexOf其中找到需要输入在内存!在生物信息学中使用的基因子串搜索必须有一些流式库,这些搜索已经实现了这种搜索。

甚至没有Wikipedia's article on string search algorithms mentiones或链接基于流的处理!

EDIT 1:我放弃了,使用蟒与bitstring模块(可带pip)。它达到了170MB/s的读取吞吐量(并且是操作系统的读取最大值)并且经过了充分测试;让我的脚本使用5行代码,即我正在寻找的东西!不过,我仍然对java的(真正的)解决方案感兴趣。


1How to Access string in file by position in Java

[2],也没有在那里的许多问题这是在我的POV错误回答(因此实际上是不对的问题)。

+1

有'FileInputStream'。这对你来说不够流畅吗? (注意:这个答案与你的问题一样) – Kayaman 2014-10-29 16:32:07

+0

@Kayaman不,因为我必须自己实现超过缓冲区大小的搜索,所以我担心在这一点上重新发明轮子。例如,如果我的(任何)'InputStream'的读取缓冲区是1024字节,我的搜索字符串是5849字节,并且我在第7次读取时发现第314个字节与'InputStream.read(byte [])'匹配,那么我仍然有很多程序,特别是测试... – 2014-10-29 16:36:22

+0

无论您的搜索字符串多长时间无关紧要,在检查其余匹配之前,您仍然会查找第一个字节。这不是一个复杂的问题。我当然会建议一个'BufferedInputStream',这样你就可以随时读取一个字节。 – Kayaman 2014-10-29 16:38:37

回答

0

你可以adapt a DataFetcher and a FetcherListener从您的文件中读取的字节[]块,直到你发现你正在寻找的字符串。您需要做的改编是照顾您的搜索字符串在两次读取之间发生的情况。因此,您需要存储最后一个searchstring.length - 每次读取的1个字节以附加到下一个读取的数据

+0

我没有在那里找到搜索功能。它如何稀疏我为了在这个问题的第二个评论中实施我搜索的例子? 'FetchListener'只为我提供了一个包含开始和结束位置的byte []',但我必须自己实现搜索,对吗? – 2014-10-29 16:47:52

相关问题