我想在java中编写一个允许我打开文件(txt)并使用用户输入的应用程序,搜索特定单词或字符串的所有实例。
由于这里可能有更多有经验的程序员,我想就如何创建这样的工具提出一些建议。您将如何创建基本的文本搜索工具?
我一直在玩一些java类,比如File,FileOutputStream,FileInputStream,InputStreamReader,OutputStreamReader,FileReader,StreamTokenizer,想知道使用java打开和搜索文件的最佳方法吗?
感谢您提供的任何意见, DES。
答案 0 :(得分:2)
将File
与Scanner
和StringBuilder
结合使用可以为您提供一个良好的开端。
答案 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。您可以下载源代码并查看它:)