Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Generics, innere Klassen
10 Die Klassenbibliothek
11 Threads und nebenläufige Programmierung
12 Datenstrukturen und Algorithmen
13 Raum und Zeit
14 Dateien und Datenströme
15 Die eXtensible Markup Language (XML)
16 Grafische Oberflächen mit Swing
17 Grafikprogrammierung
18 Netzwerkprogrammierung
19 Verteilte Programmierung mit RMI und Web–Services
20 JavaServer Pages und Servlets
21 Applets
22 Midlets und die Java ME
23 Datenbankmanagement mit JDBC
24 Reflection und Annotationen
25 Logging und Monitoring
26 Sicherheitskonzepte
27 Java Native Interface (JNI)
28 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- ZIP, ca. 14,1 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel (8. Auflage) von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel (8. Auflage)

Java ist auch eine Insel (8. Aufl.)
8., aktual. Auflage, geb., mit DVD
1.475 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1371-4
Pfeil 10 Die Klassenbibliothek
Pfeil 10.1 Die Java-Klassenphilosophie
Pfeil 10.1.1 Übersicht über die Pakete der Standardbibliothek
Pfeil 10.2 Object ist die Mutter aller Klassen
Pfeil 10.2.1 Klassenobjekte
Pfeil 10.2.2 Objektidentifikation mit toString()
Pfeil 10.2.3 Objektgleichheit mit equals() und Identität
Pfeil 10.2.4 Klonen eines Objekts mit clone()
Pfeil 10.2.5 Hashcodes über hashCode() liefern
Pfeil 10.2.6 Aufräumen mit finalize()
Pfeil 10.2.7 Synchronisation
Pfeil 10.3 Die Spezial-Oberklasse Enum
Pfeil 10.3.1 Methoden auf Enum-Objekten
Pfeil 10.3.2 enum mit eigenen Konstruktoren und Methoden
Pfeil 10.4 Klassenlader (Class Loader)
Pfeil 10.4.1 Woher die kleinen Klassen kommen
Pfeil 10.4.2 Setzen des Klassenpfades
Pfeil 10.4.3 Die wichtigsten drei Typen von Klassenladern
Pfeil 10.4.4 Der java.lang.ClassLoader
Pfeil 10.4.5 Hot Deployment mit dem URL-Classloader
Pfeil 10.4.6 Das jre/lib/endorsed-Verzeichnis
Pfeil 10.5 Die Utility-Klasse System und Properties
Pfeil 10.5.1 Systemeigenschaften der Java-Umgebung
Pfeil 10.5.2 line.separator
Pfeil 10.5.3 Property von der Konsole aus setzen
Pfeil 10.5.4 Umgebungsvariablen des Betriebssystems
Pfeil 10.5.5 Einfache Zeitmessung und Profiling
Pfeil 10.6 Ausführen externer Programme und Skripte
Pfeil 10.6.1 ProcessBuilder und Prozesskontrolle mit Process
Pfeil 10.6.2 Einen Browser/E-Mail-Client/Editor aufrufen
Pfeil 10.6.3 Ausführen von Skripten
Pfeil 10.7 Benutzereinstellungen
Pfeil 10.7.1 Benutzereinstellungen speichern
Pfeil 10.7.2 Einträge einfügen, auslesen und löschen
Pfeil 10.7.3 Auslesen der Daten und Schreiben in anderem Format
Pfeil 10.7.4 Auf Ereignisse horchen
Pfeil 10.7.5 Zugriff auf die gesamte Windows-Registry
Pfeil 10.8 Musik abspielen
Pfeil 10.8.1 Die Arbeit mit AudioClip
Pfeil 10.8.2 Java Sound API
Pfeil 10.9 Annotationen
Pfeil 10.9.1 Annotationstypen @Override, @Deprecated, @SuppressWarnings
Pfeil 10.9.2 Annotationen für Web-Services
Pfeil 10.10 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

10.7 Benutzereinstellungen Zur nächsten ÜberschriftZur vorigen Überschrift

Einstellungen des Benutzers – wie die letzten vier geöffneten Dateien oder das letzte benutzte Verzeichnis – müssen übergeben und abgespeichert werden. Dafür gibt es eine Reihe von Möglichkeiten:

  • Die Einstellungen werden auf der Kommandozeile übergeben. Das lässt die Option -D auf der Kommandozeile zu, wenn das Dienstprogramm java die JVM startet.
  • In der Regel werden die Daten auf dem Rechner in einer Datei (Property-Datei) gespeichert. Die dafür nötigen Operationen vermittelt Kapitel 14, »Dateien und Datenströme«. Ein definiertes Ausgabeformat kann auch XML sein. Wie sich Dateien in XML speichern lassen, beschreibt Kapitel 15, »Die eXtensible Markup Language (XML) «.
  • Die Daten können in einem globalen Verzeichnisbaum als nicht-lokal gespeichert werden. Dazu dienen Systeme wie JNDI, die etwa in einem LDAP-Baum die Benutzereintragungen verwalten.
  • Die Daten stehen in einer Datenbank.

Unter Windows gibt es eine andere Möglichkeit der Speicherung: die Registry.


Galileo Computing - Zum Seitenanfang

10.7.1 Benutzereinstellungen speichern Zur nächsten ÜberschriftZur vorigen Überschrift

Mit der Klasse java.util.prefs.Preferences können Konfigurationsdateien gespeichert und abgefragt werden. Unter Windows wird dazu ein Teilbaum der Registry reserviert, Unix und Mac OS X nutzen XML-Dateien. [Die Systemeigenschaften landen bei Unix unter /etc/.java/.systemPrefs und die Benutzereigenschaften lokal unter $HOME/.java/.userPrefs. Mac OS X speichert Benutzereinstellungen im Verzeichnis /Library /Preferences/.] Im Fall von Windows lässt sich nicht auf die gesamte Registry zugreifen, da Java-Programme nur einen Zweig, SOFTWARE/JavaSoft/Prefs unter HKEY_LOCAL_MACHINE beziehungsweise HKEY_CURRENT_USER, zugewiesen bekommen.

Für die Benutzereinstellungen stehen zwei Gruppen zur Verfügung: Benutzerumgebung und Systemumgebung. Preferences-Objekte lassen sich über statische Funktionen auf zwei Arten erlangen:

  • Die erste Möglichkeit nutzt einen absoluten Pfad zum Registry-Knoten. Die Funktionen sind am Preferences-Objekt befestigt und heißen für die Benutzerumgebung userRoot() und für die Systemumgebung systemRoot().
  • Die zweite Möglichkeit nutzt die Eigenschaft, dass automatisch jede Klasse in eine Paketstruktur eingebunden ist. userNodeForPackage(Class) oder systemNodeForPackage(Class) liefert ein Preferences-Objekt für eine Verzeichnisstruktur, in der die Klasse selbst liegt.

Beispiel Erfrage ein Benutzer-Preferences-Objekt über einen absoluten Pfad und über die Paketstruktur der eigenen Klasse.

Preferences userPrefs = Preferences.userRoot().node( "/com/tutego/insel" ); 
Preferences userPrefs = Preferences.userNodeForPackage( this.getClass() );

Eine Unterteilung in eine Paketstruktur ist anzuraten, da andernfalls Java-Programme gegenseitig die Einstellung überschreiben könnten; die Registry-Informationen sind für alle sichtbar. Die Einordnung in das Paket der eigenen Klasse ist eine der Möglichkeiten.



Galileo Computing - Zum Seitenanfang

10.7.2 Einträge einfügen, auslesen und löschen Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse Preferences hat große Ähnlichkeit mit den Klassen Properties beziehungsweise HashMap (vergleiche Kapitel 12, »Datenstrukturen und Algorithmen«). Schlüssel-/Werte-Paare lassen sich einfügen, löschen und erfragen. Allerdings ist die Klasse Preferences kein Mitglied der Collection-API, und es existiert auch keine Implementierung von Collection-Schnittstellen.


abstract class java.util.prefs.Preferences

  • abstract void put( String key, String value )
  • abstract void putBoolean( String key, boolean value )
  • abstract void putByteArray( String key, byte[] value )
  • abstract void putDouble( String key, double value )
  • abstract void putFloat( String key, float value )
  • abstract void putInt( String key, int value )
  • abstract void putLong( String key, long value )
    Bildet eine Assoziation zwischen den Schlüsselnamen und dem Wert. Die Varianten mit den speziellen Datentypen nehmen intern eine einfache String-Umwandlung vor und sind nur kleine Hilfsmethoden; so steht in putDouble() nur put(key, Double.toString (value)). putByteArray() konvertiert die Daten nach der Base64-Kodierung und legt sie intern als String ab.
  • abstract String get( String key, String def )
  • abstract boolean getBoolean( String key, boolean def )
  • abstract byte[] getByteArray( String key, byte def[] )
  • abstract double getDouble( String key, double def )
  • abstract float getFloat( String key, float def )
  • abstract int getInt( String key, int def )
  • abstract long getLong( String key, long def )
    Liefert den gespeicherten Wert typgerecht aus. Fehlerhafte Konvertierungen werden etwa mit einer NumberFormatException bestraft. Der zweite Parameter erlaubt die Angabe eines Alternativwerts, falls es keinen assoziierten Wert zu dem Schlüssel gibt.
  • abstract String[] keys()
    Liefert alle Knoten unter der Wurzel, denen ein Wert zugewiesen wurde. Falls der Knoten keine Eigenschaften hat, liefert keys() ein leeres Feld.
  • abstract void flush()
    Die Änderungen werden unverzüglich in den persistenten Speicher geschrieben.

Unser folgendes Programm richtet einen neuen Knoten unter /com/tutego/insel ein. Aus den über System.getProperties() ausgelesenen Systemeigenschaften sollen alle Eigenschaften, die mit »user.« beginnen, in die Registry übernommen werden.

Listing 10.33 com/tutego/insel/prefs/PropertiesInRegistry.java

package com.tutego.insel.prefs; 
 
import java.io.ByteArrayOutputStream; 
import java.util.Enumeration; 
import java.util.prefs.*; 
 
public class PropertiesInRegistry 
{ 
  static Preferences prefs = Preferences.userRoot().node( "/com/tutego/insel" ); 
 
  static void fillRegistry() 
  { 
    for ( Object o : System.getProperties().keySet() ) 
    { 
      String key = o.toString(); 
      if ( key.startsWith("user.") && System.getProperty(key).length() != 0 ) 
        prefs.put( key, System.getProperty(key) ); 
    } 
  }

Um die Elemente auszulesen, kann ein bestimmtes Element mit getXXX() erfragt werden. Die Ausgabe aller Elemente unter einem Knoten gelingt am besten mit keys(). Das Auslesen kann eine BackingStoreException auslösen, falls der Zugriff auf den Knoten nicht möglich ist. Mit get() erfragen wir anschließend den mit dem Schlüssel assoziierten Wert. Wir geben »---« aus, falls der Schlüssel keinen assoziierten Wert besitzt.

  static void display() 
  { 
    try 
    { 
      for ( String key : prefs.keys() ) 
        System.out.println( key + ": " + prefs.get(key, "---") ); 
    } 
    catch ( BackingStoreException e ) 
    { 
      System.err.println( "Knoten können nicht ausgelesen werden: " + e ); 
    } 
  }

Hinweis Die Größen der Schlüssel und Werte sind beschränkt! Der Knoten- und Schlüsselname darf maximal Preferences.MAX_NAME_LENGTH/MAX_KEY_LENGTH Zeichen umfassen, und die Werte dürfen nicht größer als MAX_VALUE_LENGTH sein. Die aktuelle Belegung der Konstanten gibt 80 Zeichen und 8 KB an.


Um Einträge wieder loszuwerden, gibt es drei Methoden: clear(), remove() und removeNode(). Die Namen sprechen für sich.


Galileo Computing - Zum Seitenanfang

10.7.3 Auslesen der Daten und Schreiben in anderem Format Zur nächsten ÜberschriftZur vorigen Überschrift

Die Daten aus den Preferences lassen sich mit exportNode(OutputStream) beziehungsweise exportSubtree(OutputStream) im UTF-8-kodierten XML-Format in einen Ausgabestrom schreiben. exportNode(OutputStream) speichert nur einen Knoten und exportSubtree(OutputStream) den Knoten inklusive seiner Kinder. Und auch der umgekehrte Weg funktioniert: importPreferences(InputStream) importiert Teile in die Registrierung. Die Schreib- und Lesemethoden lösen eine IOException bei Fehlern aus, und eine InvalidPreferencesFormatException ist beim Lesen möglich, wenn die XML-Daten ein falsches Format haben.


Galileo Computing - Zum Seitenanfang

10.7.4 Auf Ereignisse horchen Zur nächsten ÜberschriftZur vorigen Überschrift

Änderungen lassen sich mit so genannten Listenern verfolgen. (Listener werden ausgiebig bei grafischen Oberflächen eingesetzt; wir kommen im Kapitel 16 darauf zurück.) Der NodeChangeListener reagiert auf Einfüge- und Löschoperationen von Knoten, und der PreferenceChangeListener informiert bei Wertänderungen. Es ist nicht gesagt, dass Änderungen von anderen Applikationen auf den Knoten bemerkt werden.


Galileo Computing - Zum Seitenanfang

10.7.5 Zugriff auf die gesamte Windows-Registry topZur vorigen Überschrift

Wird Java unter MS Windows ausgeführt, so ergibt sich hin und wieder die Aufgabe, Eigenschaften der Windows-Umgebung zu kontrollieren. Viele Eigenschaften des Windows-Betriebssystems sind in der Registry versteckt, und Java bietet als plattformunabhängige Sprache keine Möglichkeit, diese Eigenschaften in der Registry auszulesen oder zu verändern. (Die Schnittstelle java.rmi.registry.Registry ist eine Zentrale für entfernte Aufrufe und hat mit der Windows-Registry nichts zu tun. Auch das Paket java.util.prefs mit der Klasse Preferences erlaubt nur Modifikationen an einem ausgewählten Teil der Windows-Registry.)

Um von Java auf alle Teile der Windows-Registry zuzugreifen, gibt es mehrere Möglichkeiten, unter anderem:

  • Um auf allen Werten der Windows-Registry, die dem Benutzer zugänglich sind, operieren zu können, lässt sich mit einem Trick ab Java 1.4 eine Klasse nutzen, die Preferences unter Windows realisiert: java.util.prefs.WindowsPreferences. Damit ist keine zusätzliche native Implementierung – und damit eine Windows-DLL im Klassenpfad – nötig. Die Bibliothek https://sourceforge.net/projects/jregistrykey/ realisiert eine solche Lösung.
  • Eine native Bibliothek wie das Windows Registry API Native Interface (http://tutego.com/go/jnireg), die frei zu benutzen ist und keiner besonderen Lizenz unterliegt.
  • Aufrufen des Konsolenregistrierungsprogramms reg zum Setzen und Abfragen von Schlüsselwerten.

Registry-Zugriff selbstgebaut

Für einfache Anfragen lässt sich der Registry-Zugriff schnell auch von Hand erledigen. Dazu rufen wir einfach das Kommandozeilenprogramm reg auf, um etwa den Dateinamen für den Desktop-Hintergrund anzuzeigen:

$ reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper 
 
! REG.EXE VERSION 3.0 
 
HKEY_CURRENT_USER\Control Panel\Desktop 
    Wallpaper   REG_SZ  C:\Dokumente und Einstellungen\tutego\Anwendungsdaten\Hg.bmp

Wenn wir reg von Java aufrufen, haben wir den gleichen Effekt:

Listing 10.34 com/tutego/insel/lang/JavaWinReg.java, main()

ProcessBuilder builder = new ProcessBuilder( 
  "reg", "query", 
  "\"HKEY_CURRENT_USER\\Control Panel\\Desktop\"", "/v", "Wallpaper" ); 
Process p = builder.start(); 
Scanner scanner = new Scanner( p.getInputStream() ). 
useDelimiter( "    \\w+\\s+\\w+\\s+" ); 
scanner.next(); 
System.out.println( scanner.next() );


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Tipp
Zum Katalog: Coding for Fun





 Coding for Fun


 Buchempfehlungen
Zum Katalog: Objektorientierte Programmierung





 Objektorientierte
 Programmierung


Zum Katalog: Einstieg in Eclipse 3.4






 Einstieg in
 Eclipse 3.4


Zum Katalog: Java 6 lernen mit Eclipse






 Java 6 lernen
 mit Eclipse


Zum Katalog: NetBeans Platform 6






 NetBeans
 Platform 6


Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Visual C# 2008






 Visual C# 2008


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de