我们正在开发一个在运行时读取Config文件的Java应用程序。我的问题是,以下哪种方案对于读取Config文件是有效的。
场景#1:通过打开文件,获取值,然后关闭文件,从配置中检索值。
因此,这意味着每次检索值时文件都会打开和关闭。
场景#2:在初始化期间打开文件,然后在运行时静态公开对象。
文件将打开一次,然后使用Config对象检索值。
老实说,我们目前正在使用方案#2。我们选择它的原因是因为Config文件将打开一次。打开文件需要同步,这可能导致不合时宜地检索值。此外,如果Config文件从其绝对路径移动(任何可能的事情),则场景#1可能会导致运行时错误。但是,在运行时修改Config值时,场景#1是高效的。
哪个有效?
答案 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);
}