我有一个文件(dictionary.txt),其数据字段条目如下 -
ABC This represents ...
PQR This represents ...
XYZ This represents ...
...
...
... (hundreds of such entries)
我有一个名为Searcher.java的Java程序,其功能如下
private String[] searchInsideFile(String stringToMatch, String fileName)
这将查找stringToMatch中包含的文件中是否存在任何数据字段。但是,该功能目前每次打开和关闭文件,并读取所有数百个字段以查找匹配项。
我将不得不多次(可能是数百次)调用此函数,因此,我不认为我在做什么是非常有效的。对于这种情况,是否存在良好的“设计模式”?谢谢。
答案 0 :(得分:3)
如果可能,您应该在内存中预加载文件的全部内容,并使用定义为属性的某些数据结构对其进行索引,可能是以匹配的字符串键入的Map
。然后方法searchInsideFile
应该查看数据结构内部并避免完全加载文件。
答案 1 :(得分:2)
最快的解决方案是读取文件一次并将其保存在内存中。但如果它不是一个大文件,这只是好的。如果文件太大或将来可能变得太大,则必须每次从磁盘读取它,因为您必须搜索整个文件。在这种情况下,随机访问并没有真正帮助你。
答案 2 :(得分:1)
如果文件不是太大而且不会更改,您可以在启动时将其内容读取为字符串,然后只在其上进行搜索
答案 3 :(得分:1)
我会使用ConstantDataManager模式。 基本的想法是,当你启动程序时会有一个开销,因为对象从你正在使用的文件中提取所有信息作为Vector或者你想要存储它的地图等。
然后你可以在数据存储上进行二进制搜索(假设你的字典按顺序存储单词),你可能还想在对象中有一个save方法,如果你愿意,可以将任何内容更新为文件。
一本值得关注的好书是“Java中的软件架构设计模式 - Partha Kuchana” 以下是本书相关章节的链接,但您必须付费才能看到它72小时或从中购买。您可以从任何库或其他来源获取它... http://www.crcnetbase.com/doi/pdf/10.1201/9780203496213.ch7
您是否考虑过使用MYSQL数据库,如果您的词典中包含大量条目,这可能会更快一些?
希望这有帮助, -ben
答案 4 :(得分:0)
也许将Searcher类中的文件作为实例变量,然后创建一个单独的函数来打开文件。然后更改searchInsideFile()函数以访问之前已打开的文件。记得以后关闭文件!