Чтение-запись к реестру Windows с помощью Java

318
задан Lii 24 April 2018 в 22:40
поделиться

8 ответов

Предпочтительный подход API не предоставляет Вам доступ ко всем ответвлениям реестра. На самом деле это только предоставляет Вам доступ туда, где Предпочтительный API хранит, ну, в общем, предпочтения. Это не универсальный реестр, обрабатывающий API, как.NET

К чтению-записи каждый ключ я предполагаю JNI, или внешний инструмент был бы подходом для взятия как шоу Mark.

4
ответ дан Vinko Vrsalovic 23 November 2019 в 01:02
поделиться

Существует немного поставщиков услуг JNDI для работы с реестром окон.

можно было наблюдать http://java.sun.com/products/jndi/serviceproviders.html .

5
ответ дан Duncan Jones 23 November 2019 в 01:02
поделиться

От быстрого Google:

Проверка WinPack для JNIWrapper. Это имеет полную поддержку Windows Registry access включая Чтение и Запись.

Демонстрации WinPack реализовали Средство просмотра Реестра как пример.

Проверка в http://www.teamdev.com/jniwrapper/winpack/#registry_access

И...

существует также попытка JNIRegistry http://www.trustice.com/java/jnireg/

существует также опция вызова внешнего приложения, которое ответственно за чтение / запись реестра.

11
ответ дан likejudo 23 November 2019 в 01:02
поделиться

Да, использование java.util. Предпочтительный API, так как реализация Windows его использует Реестр в качестве бэкенда.

В конце это зависит от того, что Вы желаете сделать: хранение предпочтений Вашего приложения - то, что Предпочтения делает просто большой. Если Вы будете желать на самом деле изменить ключи реестра, не имеющие отношение к Вашему приложению, Вам будет нужно некоторое приложение JNI, как описано Mark (бесстыдная кража здесь):

От быстрого Google: Проверьте WinPack на JNIWrapper. Это имеет полную поддержку Windows Registry access включая Чтение и Запись.

Демонстрации WinPack реализовали Средство просмотра Реестра как пример.

Проверка в http://www.teamdev.com/jniwrapper/winpack/#registry_access

И...

существует также попытка JNIRegistry http://www.trustice.com/java/jnireg/

существует также опция вызова внешнего приложения, которое ответственно за чтение / запись реестра.

20
ответ дан likejudo 23 November 2019 в 01:02
поделиться

Я сделал это перед использованием jRegistryKey. Это - библиотека LGPL Java/JNI, которая может сделать то, в чем Вы нуждаетесь. Вот пример того, как я привык его для включенного редактирования Реестра через regedit и также опцию "Show Folder Options" для меня в Windows с помощью реестра.

import java.io.File;
import ca.beq.util.win32.registry.RegistryKey;
import ca.beq.util.win32.registry.RegistryValue;
import ca.beq.util.win32.registry.RootKey;
import ca.beq.util.win32.registry.ValueType;


public class FixStuff {

private static final String REGEDIT_KEY = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
private static final String REGEDIT_VALUE = "DisableRegistryTools";
private static final String REGISTRY_LIBRARY_PATH = "\\lib\\jRegistryKey.dll";
private static final String FOLDER_OPTIONS_KEY = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer";
private static final String FOLDER_OPTIONS_VALUE = "NoFolderOptions";

public static void main(String[] args) {
    //Load JNI library
    RegistryKey.initialize( new File(".").getAbsolutePath()+REGISTRY_LIBRARY_PATH );

    enableRegistryEditing(true);        
    enableShowFolderOptions(true);
}

private static void enableShowFolderOptions(boolean enable) {
    RegistryKey key = new RegistryKey(RootKey.HKEY_CURRENT_USER,FOLDER_OPTIONS_KEY);
    RegistryKey key2 = new RegistryKey(RootKey.HKEY_LOCAL_MACHINE,FOLDER_OPTIONS_KEY);
    RegistryValue value = new RegistryValue();
    value.setName(FOLDER_OPTIONS_VALUE);
    value.setType(ValueType.REG_DWORD_LITTLE_ENDIAN);
    value.setData(enable?0:1);

    if(key.hasValue(FOLDER_OPTIONS_VALUE)) {
        key.setValue(value);
    }
    if(key2.hasValue(FOLDER_OPTIONS_VALUE)) {
        key2.setValue(value);
    }           
}

private static void enableRegistryEditing(boolean enable) {
    RegistryKey key = new RegistryKey(RootKey.HKEY_CURRENT_USER,REGEDIT_KEY);
    RegistryValue value = new RegistryValue();
    value.setName(REGEDIT_VALUE);
    value.setType(ValueType.REG_DWORD_LITTLE_ENDIAN);
    value.setData(enable?0:1);

    if(key.hasValue(REGEDIT_VALUE)) {
        key.setValue(value);
    }
}

}
23
ответ дан Alex Argo 23 November 2019 в 01:02
поделиться

В демонстрации WinPack есть средство просмотра реестра реализовано в качестве примера.

Проверить на http://www.jniwrapper.com/winpack_features.jsp#registry

Кстати, WinPack был перемещен по следующему адресу:

http://www.teamdev.com/jniwrapper/winpack/

0
ответ дан 23 November 2019 в 01:02
поделиться

Вы можете попробовать WinRun4J . Это средство запуска Java для Windows и хост службы, но он также предоставляет библиотеку для доступа к реестру.

(кстати, я работаю над этим проектом, поэтому дайте мне знать, если у вас есть какие-либо вопросы)

3
ответ дан 23 November 2019 в 01:02
поделиться

На самом деле, вам не нужен пакет стороннего производителя. В Windows есть утилита reg для всех операций реестра. Чтобы получить формат команды, перейдите в DOS propmt и введите:

reg /?

Вы можете вызвать reg через класс Runtime:

Runtime.getRuntime().exec("reg <your parameters here>");

Редактирование ключей и добавление новых простым способом с помощью команды, приведенной выше. Для чтения реестра необходимо получить вывод reg, и это немного сложновато. Вот код:

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;

/**
 * @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");
            return parsed[parsed.length-1];
        }
        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) { 
        }
        }

        public String getResult() {
            return sw.toString();
        }
    }
    public static void main(String[] args) {

        // Sample usage
        String value = WindowsReqistry.readRegistry("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\" 
                 + "Explorer\\Shell Folders", "Personal");
        System.out.println(value);
    }
}

129
ответ дан 23 November 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: