高效的读取配置文件的方法

时间:2015-01-13 15:31:50

标签: java file-io config

我们正在开发一个在运行时读取Config文件的Java应用程序。我的问题是,以下哪种方案对于读取Config文件是有效的。

  

场景#1:通过打开文件,获取值,然后关闭文件,从配置中检索值。

因此,这意味着每次检索值时文件都会打开和关闭。

  

场景#2:在初始化期间打开文件,然后在运行时静态公开对象。

文件将打开一次,然后使用Config对象检索值。

老实说,我们目前正在使用方案#2。我们选择它的原因是因为Config文件将打开一次。打开文件需要同步,这可能导致不合时宜地检索值。此外,如果Config文件从其绝对路径移动(任何可能的事情),则场景#1可能会导致运行时错误。但是,在运行时修改Config值时,场景#1是高效的。

哪个有效?

3 个答案:

答案 0 :(得分:0)

您的应用程序是多线程应用程序吗?如果是,您需要确保您的方案#1具有必要的同步和信号量。原因是您的配置文件是应用程序中的一般项目,将由所有线程使用。您不希望交错配置文件读取操作。即使使用单线程操作,也可以执行#1,因为您将有更少的机会出现IO错误。如果您决定移动文件,那么您在问题中提到的RTE可能会发生任何事情(?如果您在某个地方需要它,为什么会这样?)。

答案 1 :(得分:0)

如果我不得不多次访问该文件,可能我会为每个配置创建一个带有字段的class,我会读取该文件一次(仅用于初始化类字段)然后我会关闭文件。通过这种方式,您可以在初始化期间读取文件一次,然后您可以通过读取存储在类中的字段值来访问配置。

public class Configuration
{
    private static String confOne;

    private static int confTwo;

    private static boolean confThree;


    public static init(File configFile) {
        /* read the file and init fields */
    }


    public static String getConfigOne() {
        return configOne;
    }

    public static int getConfigTwo() {
        return configOne;
    }

    public static boolean getConfigThree() {
        return configOne;
    }
}

一点建议:除非绝对必要,否则不要试图打开文件(或资源)。

答案 2 :(得分:0)

我认为这两种情景都不是最好的情景:

正如您在sencario#1中已经说过的那样,您可能有很多不必要的IO-Workload,在#2中,您无法在运行时动态更改配置参数。

我建议使用两者的混合物。您可以静态加载配置一次,然后定期检查是否发生了更改。如果是这样,请重新加载配置。

您可以通过检查Java的ResourceBundle-Class来了解它是如何完成的。实际上,如果配置可以作为属性文件放在类路径中,您可以(ab?)将此实现用于您的目的:

    private static Control MY_CONTROL = new Control()
    {        
        @Override
        public long getTimeToLive(String baseName, Locale locale)
        {
            return MY_TTL; //make shure, that changes are checked periodically
        }
    };

    public static String getParamter(String name)
    {
        ResourceBundle config = ResourceBundle.getBundle("config", MY_CONTROL);
        return config.getString(name);
    }