用Java格式化数据并输入数据库
我使用java中的process builder从cmd获取硬件数据用Java格式化数据并输入数据库,java,sql,cmd,processbuilder,dataformat,Java,Sql,Cmd,Processbuilder,Dataformat,我使用java中的process builder从cmd获取硬件数据 //get info from cmd ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command("cmd.exe", "/c", "systeminfo "); try { Process proces
//get info from cmd
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("cmd.exe", "/c", "systeminfo ");
try {
Process process = processBuilder.start();
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
//write the output to the variables
String line;
//a loop which ensures all the data is read in
while ((line = reader.readLine()) != null) {
hardwareInfo.add(line);//hardwareInfo is an arraylist i currently save all this information to
}
这将返回所有相关信息以及更多信息。我的输出如下所示:
[, Host Name: LJDESKTOP, OS Name: Microsoft Windows 10 Education, OS Version: 10.0.18363 N/A Build 18363
等等
我想根据这些字段的名称(例如主机名:-是,操作系统名:-否)将其中的一些字段添加到SQL数据库中。SQL连接已经建立,我只需要找到保存这些变量的最佳方法,这样我就可以直接将它们插入数据库
那么,我如何摆脱主机名:,仍然将LJDESKTOP
输入我的数据库,以及从cmd命令获得的其余信息的相同原则呢
<>我也试着考虑效率,我希望这是尽可能的计算“光”,但这不是必要的。
到目前为止我所尝试的:
if语句会对每个变量重复,但是每次它通过while循环时,都会将每个变量添加到数组中。您可以这样尝试:
...
final Map<String,String> inputValues = new HashMap<>();
//a loop which ensures all the data is read in
while ((line = reader.readLine()) != null) {
// Read each line as key and value into a the inputValues map
final String[] pieces = line.split(":",2); // only split at the first ':'!
// Was a ':' found, e.g. the string split into two pieces?
if ( pieces.length > 1 ) {
String key = pieces[0]; // e.g. "Host Name"
String value = pieces[1]; // e.g. " LJDESKTOP"
value = value.trim(); // remove leading/trailing whitespaces from value
inputValues.put(key,value); // Store key+value to map.
}
}
// Now we can access the input values by key, e.g.:
String hostName = inputValues.get("Host Name");
String osName = inputValues.get("OS Name");
// To do: Do something with the values above, e.g. send to DB...
。。。
final Map inputValues=新HashMap();
//确保读取所有数据的循环
而((line=reader.readLine())!=null){
//将每行作为键和值读入inputValues映射中的
final String[]pieces=line.split(“:”,2);//仅在第一个“:”处拆分!
//是否找到了“:”,例如,绳子被分成两段?
如果(件长>1){
字符串键=片断[0];//例如“主机名”
字符串值=个数[1];//例如“LJDESKTOP”
value=value.trim();//从value中删除前导/尾随空格
inputValues.put(键,值);//存储要映射的键+值。
}
}
//现在我们可以通过键访问输入值,例如:
字符串hostName=inputValues.get(“主机名”);
字符串osName=inputValues.get(“OS名称”);
//要执行的操作:使用上述值执行操作,例如发送到DB。。。
到目前为止您尝试了什么?这回答了您的问题吗?看起来它可能需要一些字符串解析。删除“[”,用逗号拆分字符串以获得“主机名:LJDESKTOP”,用“:”拆分以进一步获得“主机名”,“LJDESKTOP”对,去掉字符串以去掉前后的空格,最后将得到“主机名”、“LJDESKTOP”。此时,您将能够比较键(如“主机名”)并确定在何处放置值(如“LJDESKTOP”)在JDBC调用中。@SaahilMalhotra不,我不相信这回答了我的问题,因为我没有从我的数据库中获取信息。我从我的电脑中获取信息,然后我想根据cmd返回的字段名输入到我的数据库中。@vc669抱歉,我可能真的不擅长解释这一点,但是的,我认为这是一个错误我认为解决这个问题的方法是,但我不知道它的代码。如果你能给我几分钟的时间,我将发布我到目前为止尝试过的内容。此外,我需要在执行此操作之前将其保存为变量,这会增加额外的复杂性,我无法理解…将LJDESKTOP保存为变量“hostname”(不带“Host Name:”)然后将该变量的值输入到我的数据库中。谢谢,看起来散列图就是我要找的。这也非常整洁!
...
final Map<String,String> inputValues = new HashMap<>();
//a loop which ensures all the data is read in
while ((line = reader.readLine()) != null) {
// Read each line as key and value into a the inputValues map
final String[] pieces = line.split(":",2); // only split at the first ':'!
// Was a ':' found, e.g. the string split into two pieces?
if ( pieces.length > 1 ) {
String key = pieces[0]; // e.g. "Host Name"
String value = pieces[1]; // e.g. " LJDESKTOP"
value = value.trim(); // remove leading/trailing whitespaces from value
inputValues.put(key,value); // Store key+value to map.
}
}
// Now we can access the input values by key, e.g.:
String hostName = inputValues.get("Host Name");
String osName = inputValues.get("OS Name");
// To do: Do something with the values above, e.g. send to DB...