Wie ist es möglich, die Windows-Registrierung mit Java zu lesen/schreiben?
Antworten
Zu viele Anzeigen?Wie bereits erwähnt, verwendet die Preferences API die Registry, um Einstellungen zu speichern, kann aber nicht für den Zugriff auf die gesamte Registry verwendet werden.
Ein Pirat namens David Croft hat jedoch herausgefunden, dass es möglich ist, Methoden in Suns Implementierung der Preferences API zu verwenden, um Lesen der Windows-Registrierung von Java aus ohne JNI . Das birgt einige Gefahren in sich, aber es ist einen Blick wert.
Es gibt nur wenige JNDI-Dienstanbieter, die mit der Windows-Registrierung arbeiten.
Man könnte beobachten http://java.sun.com/products/jndi/serviceproviders.html .
Mit dem Ansatz der Einstellungs-API haben Sie keinen Zugriff auf alle Zweige der Registrierung. Vielmehr erhalten Sie nur Zugriff auf den Ort, an dem die Einstellungs-API ihre, nun ja, Einstellungen speichert. Es handelt sich nicht um eine allgemeine API für die Handhabung der Registry, wie die von .NET
Um jeden Schlüssel zu lesen/schreiben, wäre wohl JNI oder ein externes Tool der richtige Ansatz, wie Mark zeigt.
Sie könnten versuchen WinRun4J . Dies ist ein Windows Java Launcher und Service Host, aber es bietet auch eine Bibliothek für den Zugriff auf die Registry.
(btw ich arbeite an diesem Projekt, also lassen Sie es mich wissen, wenn Sie irgendwelche Fragen haben)
Meine vorherige Bearbeitung der Antwort von @David wurde abgelehnt. Hier sind einige nützliche Informationen dazu.
Dieser "Zauber" funktioniert, weil Sun die Preferences
Klasse für Windows als Teil des JDK, aber es ist Paket privat . Teile der Implementierung verwenden JNI.
- Paket private Klasse von JDK
java.util.prefs.WindowsPreferences
: http://grepcode.com/file/repository.grepcode.com/java/Root/jdk/openjdk/7-b147/java/util/prefs/WindowsPreferences.java - JNI: http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/Windows/native/java/util/WindowsPreferences.c
Hier wird die Implementierung zur Laufzeit über eine Factory-Methode ausgewählt: http://grepcode.com/file/repository.grepcode.com/java/Root/jdk/openjdk/7-b147/java/util/prefs/Preferences.java#Preferences.0factory
Die eigentliche Frage: Warum stellt OpenJDK diese API nicht der Öffentlichkeit zur Verfügung?