Я работаю над программой Java, которая должна получить серийный номер машины, CPU серийный номер и т. д. В Windows интерфейс WMI - лучший способ запросить такую информацию, и стандартный способ запроса с использованием командной строки -
wmic bios get serialnumber
, который производит вывод:
SerialNumber
WWV46RT609A3467173E
Переводя это в Java, я использовал как Runtime .exec () и ProcessBuilder, например: (Прокомментированный процесс p - это то, что я делал ранее). Здесь компонент и элемент соответствуют «bios» и «серийному номеру» в командной строке выше.
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 ().