Java: чтение ключей реестра Windows перестало работать - PullRequest
2 голосов
/ 08 сентября 2011

Я читал ключи и значения, выполняя «reg query», но несколько дней назад он перестал работать.Я не изменил ни одного кода.Чтение значения ключа по-прежнему работает нормально:

        Process process = Runtime.getRuntime().exec(
                "reg query " + "\"" + root + key + "\" /v " + valueName);
        InputStreamReader inputreader = new InputStreamReader(
                process.getInputStream());
        BufferedReader reader = new BufferedReader(inputreader);
        process.waitFor();
        String line = null;
        while ((line = reader.readLine()) != null) {
            if (line.contains("REG_SZ")) {
                Pattern pattern = Pattern.compile("REG_SZ\\s*(.*)");
                Matcher matcher = pattern.matcher(line);
                while (matcher.find()) {
                    return line.substring(matcher.start(1));
                }
            } else if (line.contains("REG_DWORD")) {
                Pattern pattern = Pattern.compile("REG_DWORD\\s*(.*)");
                Matcher matcher = pattern.matcher(line);
                while (matcher.find()) {
                    return line.substring(matcher.start(1));
                }
            }
        }

Но process.waitFor () при чтении ключей никогда не возвращается.Это работало до нескольких дней назад:

        Process process = Runtime.getRuntime().exec(
                "reg query " + "\"" + root + key + "\"");
        InputStreamReader inputreader = new InputStreamReader(
                process.getInputStream());
        BufferedReader reader = new BufferedReader(inputreader);
        process.waitFor();
        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(">>"+line);
            if (line.contains(root)) {
                list.add(line.substring(line.lastIndexOf('\\') + 1));
            }
        }
        String[] keys = new String[list.size()];
        return list.toArray(keys);

Если я запускаю запрос с помощью командной строки Windows, он работает нормально, так что это не мой запрос, это неправильно ... У меня запущен апплет на сервере,но два дня назад наши внешние тестеры сообщили, что апплет замерзает.Однако он все еще работал для меня и моих коллег.Этим утром у меня тоже замерзло, и с тех пор не работает ...

1 Ответ

4 голосов
/ 08 сентября 2011

Часто вызов waitFor() не возвращается, потому что дочерний процесс заблокирован при записи.

Поскольку вы не используете выходные данные команды reg во время ее выполнения, возможно, она заполнила выходной буфер и ждет, пока вы прочитаете некоторые выходные данные, прежде чем записать больше.

Например, если в раздел реестра было добавлено больше значений, это может нарушить ранее работавший запрос.

Я рекомендую создать один поток для чтения стандартного потока вывода процессаи другой, чтобы прочитать его стандартный поток ошибок.Стандартный поток вывода сообщит EOF, когда вы прочитаете все выходные данные (это заставит ваш BufferedReader вернуть null).

На этом этапе вызов waitFor() не должен блокироваться (это вообще не безопасное предположение, но это нормально для команды reg).Наконец, вы должны destroy() процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...