Внешний процесс, запущенный с помощью ProcessBuilder / Runtime.exec (), не работает в XP, работает в Win 7

Я работаю над программой 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 ().

6
задан Community 23 May 2017 в 12:00
поделиться