Как использовать Java Runtime.exec () с утилитой Windows REG для чтения / обновления / удаления записей в HKEY_LOCAL_MACHINE \ ... \ CurrentVersion \ Run? - PullRequest
1 голос
/ 05 октября 2010

Я хочу использовать Runtime.exec (), чтобы обновить реестр для HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run используя командную утилиту Windows REG.

Необходимо иметь возможность добавлять / удалять / считывать запись из клавиши «Выполнить», чтобы позволить моему приложению Swing запускаться при запуске и проверять, настроено ли оно для запуска при запуске, чтобы я мог отметить опцию как отмеченную или не отмеченную в графическом интерфейсе Я работал с JNI, но библиотека была только 32-битной, поэтому она не работает на 64-битной. Я думаю, что это будет лучший подход. Не нужно даже включать библиотеку таким образом, и я не думаю, что REG исчезнет или изменится.

Кто-нибудь делал это раньше или знает, как это сделать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 октября 2010

Я добавил пару новых методов (addValue / deleteValue) к примеру, найденному здесь: чтение / запись в реестр Windows с использованием Java

/**
 * @author Oleg Ryaboy, based on work by Miguel Enriquez
 */
public class WindowsReqistry
{

    /**
     * 
     * @param location
     *          path in the registry
     * @param key
     *          registry key
     * @return registry value or null if not found
     */
    public static final String readRegistry(String location, String key)
    {
        try
        {
            // Run reg query, then read output with StreamReader (internal class)
            Process process = Runtime.getRuntime().exec("reg query \"" + location + "\" /v \"" + key + "\"");

            StreamReader reader = new StreamReader(process.getInputStream());
            reader.start();
            process.waitFor();
            reader.join();
            String output = reader.getResult();

            // Output has the following format:
            // \n<Version information>\n\n<key>\t<registry type>\t<value>
            if (!output.contains("\t"))
            {
                return null;
            }

            // Parse out the value
            String[] parsed = output.split("\t");
            if(parsed.length > 0)
            {
                String result = parsed[parsed.length - 1].trim();
                result = result.substring(1, result.length() - 1);
                return result;
            }
        }
        catch (Exception e)
        {
        }
        return null;
    }

    static class StreamReader extends Thread
    {
        private InputStream is;
        private StringWriter sw = new StringWriter();;

        public StreamReader(InputStream is)
        {
            this.is = is;
        }

        public void run()
        {
            try
            {
                int c;
                while ((c = is.read()) != -1)
                    sw.write(c);
            }
            catch (IOException e)
            {
            }
            finally
            {
                try
                {
                    is.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }

        public String getResult()
        {
            return sw.toString();
        }
    }

    public static boolean deleteValue(String key, String valueName)
    {
        try
        {
            // Run reg query, then read output with StreamReader (internal class)
            Process process = Runtime.getRuntime().exec("reg delete \"" + key + "\" /v \"" + valueName + "\" /f");

            StreamReader reader = new StreamReader(process.getInputStream());
            reader.start();
            process.waitFor();
            reader.join();
            String output = reader.getResult();

            // Output has the following format:
            // \n<Version information>\n\n<key>\t<registry type>\t<value>
            return output.contains("The operation completed successfully");
        }
        catch (Exception e)
        {
        }
        return false;
    }

    public static boolean addValue(String key, String valName, String val)
    {
        try
        {
            // Run reg query, then read output with StreamReader (internal class)
            Process process = Runtime.getRuntime().exec(
                    "reg add \"" + key + "\" /v \"" + valName + "\" /d \"\\\"" + val + "\\\"\" /f");

            StreamReader reader = new StreamReader(process.getInputStream());
            reader.start();
            process.waitFor();
            reader.join();
            String output = reader.getResult();

            // Output has the following format:
            // \n<Version information>\n\n<key>\t<registry type>\t<value>
            return output.contains("The operation completed successfully");
        }
        catch (Exception e)
        {
        }
        return false;
    }

}
0 голосов
/ 06 октября 2010
...