使用Java搜索文件内容?

时间:2010-12-14 23:39:41

标签: java search full-text-search

我想在java中编写一个允许我打开文件(txt)并使用用户输入的应用程序,搜索特定单词或字符串的所有实例。

由于这里可能有更多有经验的程序员,我想就如何创建这样的工具提出一些建议。您将如何创建基本的文本搜索工具?

我一直在玩一些java类,比如File,FileOutputStream,FileInputStream,InputStreamReader,OutputStreamReader,FileReader,StreamTokenizer,想知道使用java打开和搜索文件的最佳方法吗?

感谢您提供的任何意见, DES。

5 个答案:

答案 0 :(得分:2)

FileScannerStringBuilder结合使用可以为您提供一个良好的开端。

答案 1 :(得分:1)

我建议使用某种哈希表。如果您的数据没有变化(这只是对静态文档的基本搜索,还是像文本编辑器的一部分?)那么Perfect Hashing将为您提供恒定时间查找。这是非常快。如果没有,也许尝试Cuckoo哈希甚至只是线性探测。

我会使用Scanner或任何缓冲的阅读器在文件中读取,将每个单词都作为所需其他数据的关键字(例如所有出现的行号/单词索引),然后您可以查询哈希表超快。

编辑:这是一个针对字符串的完美散列的Java实现:http://blog.tomgibara.com/post/438939809/minimal-perfect-hash-strings

答案 2 :(得分:1)

您想对搜索结果做什么?是否只计算给定单词或短语的出现次数?如果用户键入“line”并且文件包含“lines”,该怎么办?应该有比赛吗?您是否必须允许在同一个文件上进行多次搜索?

无论如何,重点是全文搜索是一个非常复杂的主题。但是有帮助;-)。我的建议是使用开源Lucene项目创建要搜索的文件的内存中索引。它速度超快,可以解决上述所有问题以及更多问题。 Here是创建内存索引的代码。创建索引后,您可以执行sophisticated searches

答案 3 :(得分:0)

您可以在文本文件中读取字符串,然后调用split()方法。见文档。这将返回一个字符串数组。在此之后,您可以对阵列执行搜索(即二进制搜索)并继续执行此操作,删除找到的单词并保存位置,直到找到所有实例。之后,您将在文档中包含搜索字符串的所有位置。

以下是关于二进制搜索的维基百科文章,以防您可能需要它: http://en.m.wikipedia.org/wiki/Binary_search_algorithm?wasRedirected=true

答案 4 :(得分:0)

为了获得速度,我会使用BufferedReader。像这样:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(givenFile)));

BufferedReader是读取文件最有效的方式,恕我直言。

现有的工具由Keith Fenske创建并命名为FileSearch。您可以下载源代码并查看它:)