Overwrite the properties file if command line value is present

command-line-arguments, java, properties

Solution

Create a loop, instead.

List<String> paramNames = new ArrayList<String>{"NUMBER_OF_THREADS", "NUMBER_OF_TASKS", 
            "ID_START_RANGE", "TABLES"}; // Try to reuse the names from the property file
Map<String, String> paramMap = new HashMap<String, String>();
...
// Validate the length of args here
...
// As you table names can be passed separately. You need to handle that somehow. 
// This implementation would work when number of args will be equal to number of param names
for(int i = 0; i< args.length; i++) {
   paramMap.put(paramNames[i], args[i]); 
}

props.putAll(paramMap);
... // Here props should have it's values overridden with the ones provided

Problem

I have a program which will read everything from `config.properties` file if command line does not contain any arguments apart from config.properties file location. Below is my config.properties file- ``` NUMBER_OF_THREADS: 100 NUMBER_OF_TASKS: 10000 ID_START_RANGE: 1 TABLES: TABLE1,TABLE2 ``` If I am running my program from the command prompt like this- `java -jar Test.jar "C:\\test\\config.properties"` It should read all the four properties from the `config.properties` file. But suppose if I am running my program like this- `java -jar Test.jar "C:\\test\\config.properties" 10 100 2 TABLE1 TABLE2 TABLE3` then it should read all the properties from the arguments and overwrite the properties in config.properties file. Below is my code which is working fine in this scenario- ``` 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 } } ``` Problem Statement:- Now what I am trying to do is- Suppose if any person is running program like this `java -jar Test.jar "C:\\test\\config.properties" 10` then in my program, it should overwrite `noOfThreads` only- ``` noOfThreads should be 10 instead of 100 ``` And suppose if that person is running program like this- `java -jar Test.jar "C:\\test\\config.properties" 10 100` then in my program, it should overwrite `noOfThreads` and `noOfTasks` only- ``` noOfThreads should be 10 instead of 100 noOfTasks should be 100 instead of 10000 ``` And possible other use cases as well. Can anyone suggest me how to achieve this scenario? Thanks for the help

Original source