Java - Ukládání/načtení datových typů do Windows registru
Dost často se zde na ITnetworku i na jiných fórech řeší problém jak zajistit po spuštění programu opět určitá nastavení provedená v předchozím spuštěním. Lze to samozřejmě několika způsoby. Uložení do souboru přes znakové nebo bajtové proudy (např. *.txt, *.bin, apod.) nebo přes parsery do konfiguračních *.xml souborů, případně nám Java umožňuje daná data schovat i do Windows registrů. A protože je Java multiplatformní, měla by umožňovat tuto techniku i na ostatních OS. Pro používání není potřeba žádný framework, daná technika je součástí API Java SE 4 a vyšší.
Ve Windows se jedná o ty známe registry, ke kterým se dostaneme v příkazem regedit.exe. Java API nám umožňuje ukládat do dvou klíčů v registrech. Klíčem je objekt Preferences, který je v Java API. Samotná technologie má dispozici i vlastní dokumentaci a popis použití nacházející se v Oracle Documents
- HKEY_CURRENT_USER - Klíč se nachází v cestě HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\
- HKEY_LOCAL_MACHINE - Klíč se nachází v cestě HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs\
Samotné používání registrů zde nebudeme rozebírat a taktéž ani jejich pravidla využití (např. různí uživatelé, práva přístupu k registru apod.. ). A abychom nebyli za "rasisty", danou programovací techniku lze úspěšně využít i na alternativních operačních systémech, tedy dle stackoverflow. Ovšem ukládání do tzv. registrů na Linuxu, Unix, Solaris, MacOS nemám ověřen.
Na Unix/Linuxu je cesta k ukládání pro SystemRoot
"/etc/.java" a pro UserRoot
"${user.home}/.java/.userPrefs" .
V případě MacOS
by se uložené data měly nacházet
/Users/"Uživatel"/Library/Preferences/
Přístup k SystemRoot (HKEY_LOCAL_MACHINE)
Preferences.systemRoot()
Přístup k UserRoot (HKEY_CURRENT_USER)
Preferences.userRoot()
Příklad k vytvoření uzlu
Předvedeme si jak se s takovým objektem Preferences pracuje. V tomto prvním příkladě si vytvoříme nový uzel v registrech pro oblast HKEY_CURRENT_USER. Pokud by uzel už existoval, tak se nevytvoří a inicializace objektu Preferences nás připojí na úroveň v registrech definovanou v našem programu.
import java.util.prefs.Preferences; public class VytvoreniUzlu { @SuppressWarnings("unused") private static Preferences prefs; public static void main(String[] args) { System.out.println("Start Programu"); // vytvori uzel prefs = Preferences.userRoot().node("MujUzelDevbook"); System.out.println("Konec Programu"); } }
Spusťte si registry a uvidíte, že vznikl nový uzel MujUzelDevbook v registrech na cestě HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\/Muj/Uzel/Devbook .

Uložení dat do klíčů
Objekt Preferences umožňuje pouze uložení několik datových typů (např. String, boolean, pole byte, ..). V uvedeném příkladu si předvedeme jak snadno se dané hodnoty dají do registru uložit. Každý datový typ má v API svou metodu, u které je první parametr identifikátor klíče a druhý parametr samotná hodnota.
import java.util.prefs.Preferences; public class UlozeníDat { private static Preferences prefs; public static void main(String[] args) { System.out.println("Start Programu"); // vytvori/napojí se na uzel prefs = Preferences.userRoot().node("Priklad2"); // ulozime udaje String string = "Ulozime String do registrů"; prefs.put("klicString",string); prefs.putBoolean("klicBoolean",true); prefs.putDouble("klicDouble",3.5646d); prefs.putFloat("klicFloat",45646.234654f); prefs.putInt("klicInt", 215646); prefs.putLong("klicLong",1846546465); System.out.println("Konec Programu"); } }
Daný příklad se uloží do uzlu HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\/Priklad2 .Vznikne celkem 6 klíčů.

Načtení z klíčů
Uložení dat do registrů jsme si předvedli, tak nás logicky čeká varianta jak ta data z registrů zas získat do našeho programu. Objekt Preferences opět disponuje metodami, které dané datové typy načtou. Návratový typ definovaných metod je náš datový typ (informace načtená) z registrů. První parametr je jméno klíče a druhý parametr hodnota datového typu v případě neexistence daného klíče (viz. načtení klíče "klicSS", který v registrech neexistuje). Pokud tedy klíč neexistuje v daném uzlu, návratovým typem se stane druhý parametr v dané metodě.
import java.util.prefs.Preferences; public class NacteniDat { private static Preferences prefs; public static void main(String[] args) { System.out.println("Start Programu"); // vytvori uzel prefs = Preferences.userRoot().node("Priklad2"); // nacteme data z registru String string = null; string = prefs.get("klicString",string); System.out.println("Zde jsou data typu String : "+string); System.out.println("Zde jsou data typu Double : "+prefs.getDouble("klicDouble", 0d)); System.out.println("Zde jsou data typu Float : "+prefs.getFloat("klicFloat",0f)); System.out.println("Zde jsou data typu Int : "+prefs.getInt("klicInt", 0)); System.out.println("Zde jsou data typu Long : "+prefs.getLong("klicLong", 0L)); System.out.println("Zde jsou data typu Boolean : "+prefs.getBoolean("klicBoolean",false)); System.out.println("Zde jsou data typu String u kterych neexistuje klic : "+prefs.get("klicSS","Neni hodnota")); System.out.println("Konec Programu"); } }

Práce s úrovňovými uzly
V poslední části předvedeme vytváření uzlu v uzlech, výpis klíčů v definovaném uzlu a pak pár metod, které vypíší informace o cestě k uzlu, předka uzlu a informace k uzlu.
import java.util.prefs.*; public class HiearchiUzlu { private static Preferences prefs; @SuppressWarnings("static-access") public static void main(String[] args) throws BackingStoreException { System.out.println("Start Programu"); prefs = Preferences.userRoot().node("Program2"); System.out.println("Vypis nazvu uzlu : " + prefs.absolutePath()); System.out.println("Vypis predka uzlu : " + prefs.parent()); System.out.println("Vypis informace uzlu : " + prefs.systemRoot()); prefs = null; prefs = Preferences.userRoot().node("Uzel1").node("Uzel2").node("Uzel3"); System.out.println("Vypis nazvu uzlu : " + prefs.absolutePath()); System.out.println("Vypis predka uzlu : " + prefs.parent()); System.out.println("Vypis informace uzlu : " + prefs.systemRoot()); // ulozime klice a hodnoty prefs.put("Klic1", "Hodnota1"); prefs.put("Klic2", "Hodnota2"); // vypiseme klice String[] klice = prefs.keys(); for (String s : klice) { System.out.println("Klic : " + s); } System.out.println("Konec Programu"); } }

Jak vidíte, Java API vám umožňuje ukládat i načítat data z registrů. Zároveň umožňuje pracovat ve víceúrovňových uzlech, přecházet mezi nimi apod.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 567x (6.8 kB)