2010-12-14 78 views
2

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

由于这里可能有更多经验丰富的程序员,所以我想了解一些关于如何创建这样的工具的建议。你将如何去创建一个基本的文本搜索工具?

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

感谢您的任何输入, Des。

+0

这功课吗?如果是这样,请编辑您的问题以包括您迄今为止所完成的内容,并且我们可以帮助您改进它。 :) – 2010-12-14 23:42:09

回答

2

使用FileScannerStringBuilder应该为您提供该主题的良好开端。

0

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

这里是万一二进制搜索维基百科文章,你可能需要它: http://en.m.wikipedia.org/wiki/Binary_search_algorithm?wasRedirected=true

1

我会建议使用某种类型的哈希表。如果你的数据没有改变(这只是一个静态文档的基本搜索,或者它是文本编辑器的一部分?),那么Perfect Hashing将给你定时查找。这是非常快。如果没有,也许尝试杜鹃哈希或甚至只是线性探测。

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

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

0

要有速度,我会使用BufferedReader。这样的事情:

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

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

存在一个由Keith Fenske创建的名为FileSearch的工具。你可以下载源代码并看看它:)

+0

为什么使用包装在InputStreamReader而不是FileReader中的FileInputStream? – jzd 2010-12-15 02:14:38

1

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

总而言之,全文检索是一个非常复杂的问题。但有帮助;-)。我的建议是创建一个内存索引要使用开源Lucene项目进行搜索的文件。它速度超快,可以解答所有上述问题等等。Here是创建内存索引的代码。一旦你创建了该索引,你可以执行sophisticated searches