0

我正在尝试从 java 中的命令行读取。

假设如果我从命令行传递这些参数 -

TABLE1 TABLE2 TABLE3

然后从命令提示符读取后,tableNames列表将包含上述三个表名。

private static List<String> tableNames= new ArrayList<String>();

现在我需要遍历它并通过从属性文件中加载相应的值tableNames将所有内容放入 a 中。ConcurrentHashMap

所以我这样做的方式是这样的。

private static ConcurrentHashMap< String,
   ConcurrentHashMap< String, String >> tableList = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String,
   String >                       databaseDetails = new ConcurrentHashMap<>();
prop.load(MainTest.class.getClassLoader().getResourceAsStream("config.properties"));
for (String arg : tableNames) {
   String url = (String) prop.get(arg + ".url");
   String user = (String) prop.get(arg + ".user");
   String password = (String) prop.get(arg + ".password");
   String driver = (String) prop.get(arg + ".driver");
   String suffix = (String) prop.get(arg + ".suffix");
   String sql = (String) prop.get(arg + ".sql");
   databaseDetails.put("URL",url);
   databaseDetails.put("USER",user);
   databaseDetails.put("PASSWORD",password);
   databaseDetails.put("DRIVER",driver);
   databaseDetails.put("SUFFIX",suffix);
   databaseDetails.put("SQL",sql);
   tableList.put(arg,databaseDetails);
}

我不确定这是否是将值放入 M​​ap 的正确方法?或者我可以稍微改进一下?

4

2 回答 2

1

您需要做的主要事情是在 for 循环中移动 databaseDetails 映射的创建。目前,每次通过循环时,您都会覆盖您在上一次迭代中提取的详细信息。每次循环时,您都会收集一组新的 databaseDetails,因此需要一个新的 databaseDetails 映射来将它们放入。

于 2013-02-12T22:45:00.460 回答
1

这样,您将在表格列表中只有一张地图。您应该在每次迭代中创建一个新的 databaseDetails 映射。所以删除databaseDetails成员变量,而不是在循环中使用局部变量。

于 2013-02-12T22:45:18.320 回答