如果要不断访问文件,有什么好的“设计模式”?

时间:2012-04-04 14:02:08

标签: java file-io

我有一个文件(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中包含的文件中是否存在任何数据字段。但是,该功能目前每次打开和关闭文件,并读取所有数百个字段以查找匹配项。

我将不得不多次(可能是数百次)调用此函数,因此,我不认为我在做什么是非常有效的。对于这种情况,是否存在良好的“设计模式”?谢谢。

5 个答案:

答案 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()函数以访问之前已打开的文件。记得以后关闭文件!