我有一个文件(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)
这将查找文件中字符串ToMatch中包含的任何数据字段的出现情况。然而,该函数每次都会打开和关闭文件,并读取其数百个字段中的所有字段以查找匹配项。
我将不得不多次调用这个函数(可能有数百次),因此,我认为我所做的不是很有效。对于这种情况,有一个好的"设计模式"吗?谢谢
如果可能,您应该在内存中预加载文件的整个内容,并使用定义为属性的某些数据结构对其进行索引,可能是用要匹配的字符串键控的Map
。然后方法searchInsideFile
应该查看数据结构内部,避免完全加载文件。
最快的解决方案是读取一次文件并将其保存在内存中。但只有当它不是一个大文件时,这才是好的。如果文件太大或将来可能变得太大,您必须每次从磁盘上读取它,因为您必须搜索整个文件。在这种情况下,随机访问并不能真正帮助您。
如果文件不是太大并且不会更改,您可以在启动时将其内容读取为字符串,然后在其顶部进行
我将使用ConstantDataManager模式。基本思想是,当你启动程序时,会有一个开销,因为对象从你正在使用的文件中提取所有信息,作为矢量或你想要存储的(地图等)。
然后,你可以对数据存储进行二进制搜索(假设你的字典按顺序存储单词),如果你愿意,你可能还想在对象中有一个保存方法来更新文件中的任何内容。
一本很好的书是"Java中的软件架构设计模式-Partha Kuchana"这里有一个链接到书中的相关章节,尽管你必须付费观看72小时或从他们那里购买。你可能可以从任何图书馆或其他来源获得它。。。http://www.crcnetbase.com/doi/pdf/10.1201/9780203496213.ch7
此外,你有没有想过使用MYSQL数据库,如果你的字典有很多条目,这可能会让速度更快?
希望这能有所帮助,-Ben
也许将Searcher类中的文件作为实例变量,然后创建一个单独的函数来打开该文件。然后更改searchInsideFile()函数以访问以前已经打开的文件。之后记得关闭文件!