Comment est-il possible de lire/écrire dans le registre de Windows en utilisant java ?
Réponses
Trop de publicités?Oui, en utilisant l'API java.util.Preferences, puisque l'implémentation de Windows utilise le registre comme backend.
En fin de compte, cela dépend de ce que vous voulez faire : stocker les préférences de votre application est ce que les Préférences font très bien. Si vous souhaitez modifier des clés de registre qui n'ont rien à voir avec votre application, vous aurez besoin d'une application JNI, telle que décrite par Mark (vol éhonté ici) :
D'après une recherche rapide sur Google : Vérifiez le WinPack pour JNIWrapper. Il prend en charge l'accès complet au registre Windows, y compris la lecture et l'écriture.
Le WinPack Demo a un Registry Viewer implémenté comme exemple.
Vérifiez à http://www.teamdev.com/jniwrapper/winpack/#registry_access
Et...
Il y a aussi essayer JNIRegistry @ http://www.trustice.com/java/jnireg/
Il est également possible d'invoquer une application externe, qui se charge de lire/écrire le registre.
D'après une recherche rapide sur Google :
Vérifiez le WinPack pour JNIWrapper. Il s'agit de a un accès complet au registre de Windows y compris la lecture et l'écriture.
La démo de WinPack a le Registry Viewer est implémenté à titre d'exemple.
Vérifiez à http://www.teamdev.com/jniwrapper/winpack/#registry_access
Et...
Il y a aussi essayer JNIRegistry @ http://www.trustice.com/java/jnireg/
Il est également possible d'invoquer une application externe, qui se charge de lire/écrire le registre.
Voici une version modifiée de la solution d'Oleg. J'ai remarqué que sur mon système (Windows server 2003), la sortie de "reg query" n'est pas séparée par des tabulations (' \t ), mais à 4 espaces près.
J'ai également simplifié la solution, car un fil n'est pas nécessaire.
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);
InputStream is = process.getInputStream();
StringBuilder sw = new StringBuilder();
try
{
int c;
while ((c = is.read()) != -1)
sw.append((char)c);
}
catch (IOException e)
{
}
String output = sw.toString();
// Output has the following format:
// \n<Version information>\n\n<key> <registry type> <value>\r\n\r\n
int i = output.indexOf("REG_SZ");
if (i == -1)
{
return null;
}
sw = new StringBuilder();
i += 6; // skip REG_SZ
// skip spaces or tabs
for (;;)
{
if (i > output.length())
break;
char c = output.charAt(i);
if (c != ' ' && c != '\t')
break;
++i;
}
// take everything until end of line
for (;;)
{
if (i > output.length())
break;
char c = output.charAt(i);
if (c == '\r' || c == '\n')
break;
sw.append(c);
++i;
}
return sw.toString();
}
catch (Exception e)
{
return null;
}
}
Il existe peu de fournisseurs de services JNDI pour travailler avec le registre de Windows.
On pourrait observer http://java.sun.com/products/jndi/serviceproviders.html
Comme il a été noté, l'API Préférences utilise le registre pour stocker les préférences, mais ne peut pas être utilisée pour accéder à l'ensemble du registre.
Cependant, un pirate du nom de David Croft a découvert qu'il est possible d'utiliser les méthodes de l'implémentation de l'API des préférences de Sun pour les tâches suivantes lire le registre de Windows à partir de Java sans JNI . Il y a quelques dangers à cela, mais cela vaut la peine d'y jeter un coup d'œil.