如果您想不断访问一个文件,那么什么是一个好的“设计模式”?

3
我有一个文件(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中的任何数据字段的出现情况。然而,目前该函数每次都会打开和关闭文件,并读取它的数百个字段来查找匹配项。
我将不得不多次调用此函数(可能达到数百次),因此,我认为我的做法并不高效。对于这种情况,是否有一个好的“设计模式”?谢谢。

4
将整个文件加载到内存中是一种选择吗? - NullUserException
8
最佳的设计模式是将文件加载到内存中 :) - Sergey Kalinichenko
2
如果文件不太大且不会更改,你可以在启动时将其内容读取到字符串中,然后在其上进行搜索。 - Dan
文件不会改变。所以最好将它保存在一个巨大的字符串中。 - CodeBlue
1
@CodeBlue 嗯,你有多少内存?理论上,Java的String可以拥有最大长度为Integer.MAX_VALUE,但在那之前你很可能会耗尽内存。 - NullUserException
显示剩余8条评论
5个回答

3
如果可能的话,您应该将整个文件内容预加载到内存中,并使用一些数据结构作为属性进行索引,可能是一个以匹配字符串为键的 Map 。然后,searchInsideFile 方法应在数据结构中查找,避免完全加载文件。

2

最快的解决方案是一次性读取文件并将其保存在内存中。但如果文件太大或未来可能变得太大,则必须每次从磁盘中读取它,因为您必须搜索整个文件。在这种情况下,随机访问并不能真正帮助您。


1
如果文件不太大且不会更改,您可以在启动时将其内容读取到字符串中,然后在其上进行搜索。

1
我会使用ConstantDataManager模式。基本思路是,当您启动程序时,对象将从您正在使用的文件中提取所有信息,并将其存储为向量或其他(Map等)格式,这将产生一些开销。
然后,您可以在数据存储中进行二进制搜索(假设您的字典按顺序存储单词),您可能还想在对象中拥有一个保存方法,以便在需要时更新任何内容到文件中。
推荐一本好书《Java软件架构设计模式-Partha Kuchana》,这里是书中相关章节的链接,虽然您需要付费才能在72小时内查看或从他们那里购买,但您可能可以从图书馆或其他来源获取...
此外,您是否考虑过使用MYSQL数据库?如果您的字典条目很多,这可能会使速度更快。
希望这可以帮助您, -Ben

0
也许可以将该文件作为Searcher类的实例变量,然后创建一个单独的函数来打开该文件。然后修改searchInsideFile()函数以访问先前已经打开的文件。记得在操作完成后关闭文件!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接