有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java读取配置文件的有效方法

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

Scenario #1: Retrieves a value from config by opening the file, get the value, then close the file.

这意味着每次检索一个值时,该文件都会被打开和关闭

Scenario #2: Open the file during initialization, then expose the object statically across the runtime.

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

老实说,我们目前使用的场景是#2。我们之所以选择它,是因为配置文件只会打开一次。打开文件需要同步,这可能会导致过早检索值。此外,如果配置文件从其绝对路径移动(任何事情都有可能),场景#1可能会导致运行时错误。但在运行时修改配置值时,场景#1是有效的

那么哪一个是有效的呢


共 (2) 个答案

  1. # 1 楼答案

    如果我必须多次访问该文件,我可能会为每个配置创建一个带有字段的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. # 2 楼答案

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

    正如您在sencario#1中所述,您可能有很多不必要的IO工作负载,而在#2中,您无法在运行时动态更改配置参数

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

    您可以通过查看Java的ResourceBundle类来了解这一点。事实上,如果配置可以作为属性文件放在类路径中,那么您可以(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);
        }