java - 如果存在命令行值,则覆盖属性文件

标签 java properties command-line-arguments

如果命令行不包含除 config.properties 文件位置之外的任何参数,我有一个程序将从 config.properties 文件中读取所有内容。下面是我的 config.properties 文件-

NUMBER_OF_THREADS: 100
NUMBER_OF_TASKS: 10000
ID_START_RANGE: 1
TABLES: TABLE1,TABLE2

如果我像这样从命令提示符运行我的程序-

java -jar Test.jar "C:\\test\\config.properties"

它应该从 config.properties 文件中读取所有四个属性。但是假设如果我像这样运行我的程序-

java -jar Test.jar "C:\\test\\config.properties"10 100 2 TABLE1 TABLE2 TABLE3

然后它应该从参数中读取所有属性并覆盖 config.properties 文件中的属性。

下面是我的代码,在这种情况下运行良好-

public static void main(String[] args) {

        try {

            readPropertyFiles(args);

        } catch (Exception e) {
            LOG.error("Threw a Exception in" + CNAME + e);
        }
    }

    private static void readPropertyFiles(String[] args) throws FileNotFoundException, IOException {

        location = args[0];

        prop.load(new FileInputStream(location));

        if(args.length >= 1) {
            noOfThreads = Integer.parseInt(args[1]);
            noOfTasks = Integer.parseInt(args[2]);
            startRange = Integer.parseInt(args[3]);

            tableName = new String[args.length - 4];
            for (int i = 0; i < tableName.length; i++) {
                tableName[i] = args[i + 4];
                tableNames.add(tableName[i]);
            }
        } else {
            noOfThreads = Integer.parseInt(prop.getProperty("NUMBER_OF_THREADS").trim());
            noOfTasks = Integer.parseInt(prop.getProperty("NUMBER_OF_TASKS").trim());
            startRange = Integer.parseInt(prop.getProperty("ID_START_RANGE").trim());
            tableNames = Arrays.asList(prop.getProperty("TABLES").trim().split(","));
        }

        for (String arg : tableNames) {

            //Some Other Code

        }
    }   

问题陈述:-

现在我要做的是-假设是否有人正在运行这样的程序

java -jar Test.jar "C:\\test\\config.properties"10

然后在我的程序中,它应该只覆盖 noOfThreads-

noOfThreads should be 10 instead of 100

假设那个人正在运行这样的程序-

java -jar Test.jar "C:\\test\\config.properties"10 100

然后在我的程序中,它应该只覆盖 noOfThreadsnoOfTasks-

noOfThreads should be 10 instead of 100
noOfTasks should be 100 instead of 10000

还有其他可能的用例。

谁能建议我如何实现这种情况?感谢您的帮助

最佳答案

定义命令行输入时如下

java -jar Test.jar "C:\\test\\config.properties"10 100

这意味着必须始终提供 noOfThreads 来覆盖 noOfTasks

要解决此问题,您可以在命令行上将这些指定为系统属性以及文件位置,否则文件位置也有默认位置。例如:-

java -jar -Dconfig.file.location="C:\\test\\config.properties"-DNUMBER_OF_THREADS=10 Test.jar

然后。

  1. 将文件属性读入Properties
  2. 遍历属性中的键并找到相应的 System.getProperty()
  3. 如果找到值,则覆盖属性中的相应条目。

这样无论您引入多少新属性,您的代码都将始终保持不变。

您可以更进一步,将所有这些封装在 PropertyUtil 中,它还提供实用方法,例如 getIntProperty()getStringProperty()等等

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertyUtil {

  private static final String DEFAULT_CONFIG_FILE_LOCATION = "config.properties";

  private String configFileLocation;

  private Properties properties;

  public PropertyUtil() throws IOException {

    this(DEFAULT_CONFIG_FILE_LOCATION);
  }

  public PropertyUtil(String configFileLocation) throws IOException {

    this.configFileLocation = configFileLocation;
    this.properties = new Properties();
    init();
  }

  private void init() throws IOException {

    properties.load(new FileInputStream(this.configFileLocation));

    for (Object key : this.properties.keySet()) {

      String override = System.getProperty((String) key);

      if (override != null) {

        properties.put(key, override);
      }
    }
  }

  public int getIntProperty(String key) {

    return this.properties.contains(key) ? Integer.parseInt(properties.get(key)) : null;
  }

  public String getStringProperty(String key) {

    return (String) this.properties.get(key);
  }
}

例子。

配置属性

NUMBER_OF_THREADS=100
NUMBER_OF_TASKS=10000
ID_START_RANGE=1
TABLES=TABLE1,TABLE2

覆盖 NUMBER_OF_THREADS

java -jar -Dconfig.file.location="C:\\test\\config.properties"-DNUMBER_OF_THREADS=10 Test.jar

将“NUMBER_OF_THREADS”读取为 int 的简写示例。

new PropertyUtil(System.getProperty("config.file.location")).getIntProperty("NUMBER_OF_THREADS");

关于java - 如果存在命令行值,则覆盖属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15469504/

相关文章:

java - 使用正则表达式匹配查询字符串中的重复模式

java - 关闭池中的 JDBC 连接

java.net.UnknownHostException : Unable to resolve host "api. themoviedb.org

java - 使用作为该类对象的方法的参数调用类的方法

c++ - 解析多个命令行开关

objective-c - 所有属性都应该声明为 "nonatomic"吗?

ios - 为什么使用self.propertyname而不是_propertyname设置我的属性为零

delphi - 有没有办法在 Delphi 6 中自动分配动态创建的组件的事件处理程序?

用于解析引用参数的 Java RegEx

bash - 是否可以使用多个命令行参数运行 matlab 函数?