Я работаю над Java-программой, которая должна извлекать серийный номер компьютера, серийный номер процессора и т. Д. В Windows интерфейс WMI является лучшим способом запроса такой информации, а стандартный способ запроса с использованием командной строки -
wmic bios get serialnumber
, который производит вывод:
SerialNumber
WWV46RT609A3467173E
Переводя это на Java, я использовал и Runtime.exec (), и ProcessBuilder, например, так:делал ранее).Здесь компонент и элемент соответствуют 'bios' и 'serialnumber' в командной строке выше.
String ret = "";
ProcessBuilder pb = new ProcessBuilder("wmic", component, "get", item);
pb.redirectErrorStream(true);
// Process p = Runtime.getRuntime().exec(
// "wmic " + component + " get " + item);
Process p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader input = new BufferedReader(isr);
String str;
while ((str = input.readLine()) != null) {
if (str.equalsIgnoreCase(item) || StringUtils.isBlank(str)) {
continue;
}
ret = str.trim();
}
input.close();
isr.close();
System.out.println(ret);
Этот фрагмент прекрасно работает в Windows 7, но зависает в Windows XP.Использование wmic из командной строки работает на обеих ОС.Я прочитал здесь , что существует проблема с обработкой как stdout, так и stderr вызываемого процесса, следовательно, вызов redirectErrorStream ().
Почему он работает безупречно в Windows 7, но не работает в XP?Есть ли другой способ, кроме порождения отдельного потока, то есть ' StreamGobbler '?(Связанный пример довольно древний и предшествует классу ProcessBuilder с его вызовом redirectErrorStream ().