Я получаю данные об оборудовании из cmd, используя построитель процессов в java.
//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 настроено. Мне просто нужно найти лучший способ сохранить эти переменные, чтобы я мог вставить их прямо в свою базу данных.
Итак, как мне избавиться от Host Name:
и по-прежнему вводить LJDESKTOP
в свою базу данных, и тот же принцип для остальной информации, которую я получаю от команды cmd.
Я также пытаюсь учитывать эффективность, я хочу, чтобы это было как можно более «легким» в вычислительном отношении, но это не обязательно.
Что я пробовал до сих пор:
Я попытался разбить строку на «:» для каждой переменной и обрезки. Это дает мне именно ту информацию, которая мне нужна, но я не могу сохранить ее в отдельных переменных. Это потому, что бит, который я обрезал, определяет, какие у меня переменные. (Могу ли я потенциально добавить функцию обрезки в мой сеттер?)
Я пытался:
в то время как ((строка = reader.readLine()) != ноль) {
if (line.startsWith("Host Name:")) {
setHostname(line.replaceFirst("Host Name: ", ""));}
операторы if повторяются для каждой переменной, однако каждый раз, когда это добавляет каждую переменную в мой массив каждый раз, когда она проходит через цикл while.
Отвечает ли это на ваш вопрос? Как получить идентификатор вставки в JDBC?
Похоже, он может использовать некоторый синтаксический анализ строк. Отбросьте «[», разделите строку запятой, чтобы получить «Имя хоста: LJDESKTOP», разделите на «:», чтобы получить пары «Имя хоста», «LJDESKTOP», разделите строки, чтобы избавиться от пробелов до и после, и вы получите «Имя хоста», «LJDESKTOP». В этот момент вы сможете сравнить свои ключи (например, «Имя хоста») и выяснить, где разместить значение (например, «LJDESKTOP») в вызовах JDBC.
@SaahilMalhotra Нет, я не верю, что это отвечает на мой вопрос, поскольку я не получаю информацию из своей базы данных. Я получаю информацию со своего компьютера, а затем хочу ввести ее в свою базу данных в зависимости от имени поля, возвращаемого cmd.
@ vc669 извините, я, вероятно, очень плохо объясняю это, но да, я думаю, что это правильное решение, как я считаю, но я не знаю кода для этого. Если вы можете дать мне несколько минут, я опубликую то, что я пробовал до сих пор. Также мне нужно сохранить его как переменную, прежде чем я это сделаю, что добавляет дополнительную сложность, я не могу понять... сохраните LJDESKTOP как переменную «имя хоста» (без «Имени хоста:»), затем введите значение этой переменной в моя база данных.
@ScaryWombat Я отредактирую свой пост, чтобы рассказать вам, что я уже пробовал. Дай мне пару минут.
@LiamWBA вам не нужно хранить его в переменной с именем hostname. Вот некоторый псевдокод, вместо этого вы можете просто сделать что-то вроде if ( key matches "Host name:") db.put("host_name",value)
в зависимости от ваших реальных переменных. На практике это может привести к switch
.
Ваш тег для processbuilder
и первая половина вашего Вопроса не имеют значения. Публикуя здесь, приложите некоторые усилия, чтобы сократить свой вопрос до минимума, необходимого для выражения вашей проблемы.
Дубликат: Java анализирует строку с большим количеством пробелов
@BasilBourque Я уже пробовал, по какой-то причине он не распознавал пробелы как пробелы. Я думаю, это связано с форматом, который выводит CMD. Поэтому я подумал, что было бы уместно включить построитель процессов, чтобы вы знали, откуда я беру информацию.
Вы можете попробовать это так:
...
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...
Спасибо, похоже, хеш-карта - это то, что я искал. это тоже очень аккуратно!
Итак, что вы пробовали до сих пор?