Rheinwerk Computing < openbook >


 
Inhaltsverzeichnis
Materialien
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Arrays und ihre Anwendungen
5 Der Umgang mit Zeichenketten
6 Eigene Klassen schreiben
7 Objektorientierte Beziehungsfragen
8 Ausnahmen müssen sein
9 Geschachtelte Typen
10 Besondere Typen der Java SE
11 Generics<T>
12 Lambda-Ausdrücke und funktionale Programmierung
13 Architektur, Design und angewandte Objektorientierung
14 Java Platform Module System
15 Die Klassenbibliothek
16 Einführung in die nebenläufige Programmierung
17 Einführung in Datenstrukturen und Algorithmen
18 Einführung in grafische Oberflächen
19 Einführung in Dateien und Datenströme
20 Einführung ins Datenbankmanagement mit JDBC
21 Bits und Bytes, Mathematisches und Geld
22 Testen mit JUnit
23 Die Werkzeuge des JDK
A Java SE-Module und Paketübersicht
Stichwortverzeichnis


Download:

- Listings, ca. 2,7 MB


Buch bestellen
Ihre Meinung?



Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom

Einführung, Ausbildung, Praxis
Buch: Java ist auch eine Insel


Java ist auch eine Insel

Pfeil 15 Die Klassenbibliothek
Pfeil 15.1 Die Java-Klassenphilosophie
Pfeil 15.1.1 Modul, Paket, Typ
Pfeil 15.1.2 Übersicht über die Pakete der Standardbibliothek
Pfeil 15.2 Einfache Zeitmessung und Profiling *
Pfeil 15.3 Die Klasse Class
Pfeil 15.3.1 An ein Class-Objekt kommen
Pfeil 15.3.2 Eine Class ist ein Type
Pfeil 15.4 Klassenlader
Pfeil 15.4.1 Die Klasse java.lang.ClassLoader
Pfeil 15.5 Die Utility-Klassen System und Properties
Pfeil 15.5.1 Speicher der JVM
Pfeil 15.5.2 Anzahl der CPUs bzw. Kerne
Pfeil 15.5.3 Systemeigenschaften der Java-Umgebung
Pfeil 15.5.4 Eigene Properties von der Konsole aus setzen *
Pfeil 15.5.5 Zeilenumbruchzeichen, line.separator
Pfeil 15.5.6 Umgebungsvariablen des Betriebssystems
Pfeil 15.6 Sprachen der Länder
Pfeil 15.6.1 Sprachen in Regionen über Locale-Objekte
Pfeil 15.7 Wichtige Datum-Klassen im Überblick
Pfeil 15.7.1 Der 1.1.1970
Pfeil 15.7.2 System.currentTimeMillis()
Pfeil 15.7.3 Einfache Zeitumrechnungen durch TimeUnit
Pfeil 15.8 Date-Time-API
Pfeil 15.8.1 Menschenzeit und Maschinenzeit
Pfeil 15.8.2 Die Datumsklasse LocalDate
Pfeil 15.9 Logging mit Java
Pfeil 15.9.1 Logging-APIs
Pfeil 15.9.2 Logging mit java.util.logging
Pfeil 15.10 Maven: Build-Management und Abhängigkeiten auflösen
Pfeil 15.10.1 Beispielprojekt in Eclipse mit Maven
Pfeil 15.10.2 Properties hinzunehmen
Pfeil 15.10.3 Dependency hinzunehmen
Pfeil 15.10.4 Lokales und das Remote-Repository
Pfeil 15.10.5 Lebenszylus, Phasen und Maven-Plugins
Pfeil 15.10.6 Archetypes
Pfeil 15.11 Zum Weiterlesen
 

Zum Seitenanfang

15.5    Die Utility-Klassen System und Properties Zur vorigen ÜberschriftZur nächsten Überschrift

In der Klasse java.lang.System finden sich Methoden zum Erfragen und Ändern von Systemvariablen, zum Umlenken der Standarddatenströme, zum Ermitteln der aktuellen Zeit, zum Beenden der Applikation und noch für das ein oder andere. Alle Methoden sind ausschließlich statisch, und ein Exemplar von System lässt sich nicht anlegen. In der Klasse java. lang.Runtime finden sich zusätzlich Hilfsmethoden, wie etwa für das Starten von externen Programmen oder Methoden zum Erfragen des Speicherbedarfs. Anders als System ist hier nur eine Methode statisch, nämlich die Singleton-Methode getRuntime(), die das Exemplar von Runtime liefert.

Eigenschaften der Klassen »System« und »Runtime«

Abbildung 15.4    Eigenschaften der Klassen »System« und »Runtime«

Bemerkung

Insgesamt machen die Klassen System und Runtime keinen besonders aufgeräumten Eindruck (siehe Abbildung 15.4); sie wirken irgendwie so, als sei hier alles zu finden, was an anderer Stelle nicht mehr hineingepasst hat. Auch wären manche Methoden der einen Klasse genauso gut in der anderen Klasse aufgehoben.

Dass die statische Methode System.arraycopy(…) zum Kopieren von Arrays nicht in java.util.Arrays stationiert ist, lässt sich nur historisch erklären. Und System.exit(int) leitet an Runtime.getRuntime().exit(int) weiter. Einige Methoden sind veraltet und anders verteilt: Das exec(…) von Runtime zum Starten von externen Prozessen übernimmt eine neue Klasse ProcessBuilder, und die Frage nach dem Speicherzustand oder der Anzahl der Prozessoren beantworten MBeans, wie etwa ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors(). Aber API-Design ist wie Sex: Eine unüberlegte Aktion, und die Brut lebt mit uns für immer.

 

Zum Seitenanfang

15.5.1    Speicher der JVM Zur vorigen ÜberschriftZur nächsten Überschrift

Das Runtime -Objekt hat drei Methoden, die Auskunft über den Speicher der JVM geben:

  • maxMemory() liefert die Anzahl der Bytes, die maximal für die JVM verfügbar sind. Der Wert kann beim Aufruf der JVM mit -Xmx in der Kommandozeile gesetzt werden.

  • totalMemory() ist das, was aktuell genutzt wird und bis auf maxMemory() wachsen kann. Es kann prinzipiell auch wieder schrumpfen. Es gilt: maxMemory() > totalMemory().

  • freeMemory() ist das, was frei für neue Objekte ist und die automatische Speicherbereinigung auch wieder anhebt. Es gilt: totalMemory() > freeMemory(). Allerdings ist freeMemory() nicht der gesamte freie verfügbare Speicherbereich, denn es fehlt noch der »Anteil« von maxMemory().

Zwei Informationen fehlen also, die berechnet werden müssen:

Benutzter Speicher:

long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

Freier Gesamtspeicher:

long totalFreeMemory = Runtime.getRuntime().maxMemory() - usedMemory;
[zB]  Beispiel

Gib Informationen über den Speicher auf einem Rechner aus:

long totalMemory     = Runtime.getRuntime().totalMemory();

long freeMemory = Runtime.getRuntime().freeMemory();

long maxMemory = Runtime.getRuntime().maxMemory();

long usedMemory = totalMemory - freeMemory;

long totalFreeMemory = maxMemory - usedMemory;



System.out.printf(

"total=%d MiB, free=%d MiB, max=%d MiB, used=%d MiB, total free=%d MiB%n",

totalMemory >> 20, freeMemory >> 20, maxMemory >> 20,

usedMemory >> 20, totalFreeMemory >> 20 );

Die Ausgabe kann sein:

total=126 MiB, free=124 MiB, max=2016 MiB, used=1 MiB, total free=2014 MiB
 

Zum Seitenanfang

15.5.2    Anzahl der CPUs bzw. Kerne Zur vorigen ÜberschriftZur nächsten Überschrift

Die Runtime-Methode availableProcessors() liefert die Anzahl logischer Prozessoren bzw. Kerne.

[zB]  Beispiel
System.out.println( Runtime.getRuntime().availableProcessors() );  // 4
 

Zum Seitenanfang

15.5.3    Systemeigenschaften der Java-Umgebung Zur vorigen ÜberschriftZur nächsten Überschrift

Die Java-Umgebung verwaltet Systemeigenschaften wie Pfadtrenner oder die Version der virtuellen Maschine in einem java.util.Properties-Objekt. Die statische Methode System.getProperties() erfragt diese Systemeigenschaften und liefert das gefüllte Properties-Objekt zurück. Zum Erfragen einzelner Eigenschaften ist das Properties-Objekt aber nicht unbedingt nötig: System.getProperty(…) erfragt direkt eine Eigenschaft.

[zB]  Beispiel

Gib den Namen des Betriebssystems aus:

System.out.println( System.getProperty( "os.name" ) );  // z. B. Windows 10

Gib alle Systemeigenschaften auf dem Bildschirm aus:

System.getProperties().list( System.out );

Die Ausgabe beginnt mit:

-- listing properties --

sun.desktop=windows

awt.toolkit=sun.awt.windows.WToolkit

java.specification.version=9

file.encoding.pkg=sun.io

sun.cpu.isalist=amd64

Tabelle 15.5 zeigt eine Liste der wichtigen Standardsystemeigenschaften:

Schlüssel

Bedeutung

java.version

Version der Java-Laufzeitumgebung

java.class.path

Eigener Klassenpfad

java.library.path

Pfad für native Bibliotheken

java.io.tmpdir

Pfad für temporäre Dateien

os.name

Name des Betriebssystems

file.separator

Trenner der Pfadsegmente, etwa / (Unix) oder \ (Windows)

path.separator

Trenner bei Pfadangaben, etwa : (Unix) oder ; (Windows)

line.separator

Zeilenumbruchzeichen(folge)

user.name

Name des angemeldeten Benutzers

user.home

Home-Verzeichnis des Benutzers

user.dir

Aktuelles Verzeichnis des Benutzers

Tabelle 15.5    Standardsystemeigenschaften

API-Dokumentation

Ein paar weitere Schlüssel zählt die API-Dokumentation bei System.getProperties() auf. Einige der Variablen sind auch anders zugänglich, etwa über die Klasse File.

final class java.lang.System
  • static String getProperty(String key)

    Gibt die Belegung einer Systemeigenschaft zurück. Ist der Schlüssel null oder leer, gibt es eine NullPointerException bzw. eine IllegalArgumentException.

  • static String getProperty(String key, String def)

    Gibt die Belegung einer Systemeigenschaft zurück. Ist sie nicht vorhanden, liefert die Methode die Zeichenkette def, den Default-Wert. Für die Ausnahmen gilt das Gleiche wie bei getProperty(String).

  • static String setProperty(String key, String value)

    Belegt eine Systemeigenschaft neu. Die Rückgabe ist die alte Belegung – oder null, falls es keine alte Belegung gab.

  • static String clearProperty(String key)

    Löscht eine Systemeigenschaft aus der Liste. Die Rückgabe ist die alte Belegung – oder null, falls es keine alte Belegung gab.

  • static Properties getProperties()

    Liefert ein mit den aktuellen Systembelegungen gefülltes Properties-Objekt.

 

Zum Seitenanfang

15.5.4    Eigene Properties von der Konsole aus setzen * Zur vorigen ÜberschriftZur nächsten Überschrift

Eigenschaften lassen sich auch beim Programmstart von der Konsole aus setzen. Dies ist praktisch für eine Konfiguration, die beispielsweise das Verhalten des Programms steuert. In der Kommandozeile werden mit -D der Name der Eigenschaft und nach einem Gleichheitszeichen (ohne Weißraum) ihr Wert angegeben. Das sieht dann etwa so aus:

$ java -DLOG –DUSER=Chris -DSIZE=100 com.tutego.insel.lang.SetProperty

Die Property LOG ist einfach nur »da«, aber ohne zugewiesenen Wert. Die nächsten beiden Properties, USER und SIZE, sind mit Werten verbunden, die erst einmal vom Typ String sind und vom Programm weiterverarbeitet werden müssen. Die Informationen tauchen nicht bei der Argumentliste in der statischen main(String[])-Methode auf, da sie vor dem Namen der Klasse stehen und bereits von der Java-Laufzeitumgebung verarbeitet werden.

Entwicklungsumgebungen erlauben es, die Kommandozeilenargumente in einem Fenster zu setzen. Unter Eclipse gehen wir dazu unter »Run • Run Configurations« zum Reiter »Arguments«.

Abbildung 15.5    Entwicklungsumgebungen erlauben es, die Kommandozeilenargumente in einem Fenster zu setzen. Unter Eclipse gehen wir dazu unter »Run • Run Configurations« zum Reiter »Arguments«.

Um die Eigenschaften auszulesen, nutzen wir das bekannte System.getProperty(…):

Listing 15.3    com/tutego/insel/lang/SetProperty.java, main()

Optional<String> logProperty = ofNullable( System.getProperty( "LOG" ) );

Optional<String> usernameProperty = ofNullable( System.getProperty( "USER" ) );

Optional<String> sizeProperty = ofNullable( System.getProperty( "SIZE" ) );



System.out.println( logProperty.isPresent() ); // true

usernameProperty.ifPresent( System.out::println ); // Chris

sizeProperty.map( Integer::parseInt ).ifPresent( System.out::println ); // 100

System.out.println( System.getProperty( "DEBUG", "false" ) ); // false

Wir bekommen über getProperty(String) einen String zurück, der den Wert anzeigt. Falls es überhaupt keine Eigenschaft dieses Namens gibt, erhalten wir stattdessen null. So wissen wir auch, ob dieser Wert überhaupt gesetzt wurde. Ein einfacher null-Test sagt also aus, ob logProperty vorhanden ist oder nicht. Statt -DLOG führt auch -DLOG= zum gleichen Ergebnis, denn der assoziierte Wert ist der Leer-String. Da alle Properties erst einmal vom Typ String sind, lässt sich usernameProperty einfach ausgeben, und wir bekommen entweder null oder den hinter = angegebenen String. Sind die Typen keine Strings, müssen sie weiterverarbeitet werden, also etwa mit Integer.parseInt(), Double.parseDouble() usw. Nützlich ist die Methode System.getProperty(String, String), der zwei Argumente übergeben werden, denn das zweite Argument steht für einen Default-Wert. So kann immer ein Standardwert angenommen werden.

Boolean.getBoolean(String)

Im Fall von Properties, die mit Wahrheitswerten belegt werden, kann Folgendes geschrieben werden:

boolean b = Boolean.parseBoolean( System.getProperty( property ) );  // (*)

Für die Wahrheitswerte gibt es eine andere Variante. Die statische Methode Boolean.getBoolean(String) sucht aus den System-Properties eine Eigenschaft mit dem angegebenen Namen heraus. Analog zur Zeile (*) ist also:

boolean b = Boolean.getBoolean( property );

Es ist schon erstaunlich, diese statische Methode in der Wrapper-Klasse Boolean anzutreffen, weil Property-Zugriffe nichts mit den Wrapper-Objekten zu tun haben und die Klasse hier eigentlich über ihre Zuständigkeit hinausgeht.

Gegenüber einer eigenen, direkten System-Anfrage hat getBoolean(String) auch den Nachteil, dass wir bei der Rückgabe false nicht unterscheiden können, ob es die Eigenschaft schlichtweg nicht gibt oder ob die Eigenschaft mit dem Wert false belegt ist. Auch falsch gesetzte Werte wie -DP=fa1se ergeben immer false.[ 238 ](Das liegt an der Implementierung: Boolean.valueOf("false") liefert genauso false wie Boolean.valueOf("") oder Boolean.valueOf(null). )

final class java.lang.Boolean

implements Serializable, Comparable<Boolean>
  • static boolean getBoolean(String name)

    Liest eine Systemeigenschaft mit dem Namen name aus und liefert true, wenn der Wert der Property gleich dem String "true" ist. Die Rückgabe ist false, wenn entweder der Wert der Systemeigenschaft "false" ist oder wenn er nicht existiert oder null ist.

 

Zum Seitenanfang

15.5.5    Zeilenumbruchzeichen, line.separator Zur vorigen ÜberschriftZur nächsten Überschrift

Um nach dem Ende einer Zeile an den Anfang der nächsten zu gelangen, wird ein Zeilenumbruch (engl. new line) eingefügt. Das Zeichen für den Zeilenumbruch muss kein einzelnes sein, es können auch mehrere Zeichen nötig sein. Zum Leidwesen der Programmierer unterscheidet sich die Anzahl der Zeichen für den Zeilenumbruch auf den bekannten Architekturen:

  • Unix: Line Feed (Zeilenvorschub)

  • Macintosh: Carriage Return (Wagenrücklauf)

  • Windows: beide Zeichen (Carriage Return und Line Feed)

Der Steuercode für Carriage Return (kurz CR) ist 13 (0x0D), der für Line Feed (kurz LF) 10 (0x0A). Java vergibt obendrein eigene Escape-Sequenzen für diese Zeichen: \r für Carriage Return und \n für Line Feed. (Die Sequenz \f für einen Form Feed, also einen Seitenvorschub, spielt bei den Zeilenumbrüchen keine Rolle.)

In Java gibt es drei Möglichkeiten, um an das Zeilenumbruchzeichen bzw. die Zeilenumbruchzeichenfolge des Systems heranzukommen:

  1. mit dem Aufruf von System.getProperty("line.separator")

  2. mit dem Aufruf von System.lineSeparator()

  3. Nicht immer ist es nötig, das Zeichen (bzw. genau genommen eine mögliche Zeichenfolge) einzeln zu erfragen. Ist das Zeichen Teil einer formatierten Ausgabe beim Formatter, String.format(…) bzw. printf(…), so steht der Formatspezifizierer %n für genau die im System hinterlegte Zeilenumbruchzeichenfolge.

 

Zum Seitenanfang

15.5.6    Umgebungsvariablen des Betriebssystems Zur vorigen ÜberschriftZur nächsten Überschrift

Fast jedes Betriebssystem nutzt das Konzept der Umgebungsvariablen (engl. environment variables); bekannt ist etwa PATH für den Suchpfad für Applikationen unter Windows und unter Unix. Java macht es möglich, auf diese System-Umgebungsvariablen zuzugreifen. Dazu dienen zwei statische Methoden:

final class java.lang.System
  • static Map<String, String> getEnv()

    Liest eine Menge von <String, String>-Paaren mit allen Systemeigenschaften.

  • static String getEnv(String name)

    Liest eine Systemeigenschaft mit dem Namen name. Gibt es sie nicht, ist die Rückgabe null.

[zB]  Beispiel

Was ist der Suchpfad? Den liefert System.getenv("path");[ 239 ](Das Ergebnis weicht von System.getProperty("os.name") ab, was bei Windows 10 schon »Windows 10« liefert. )

Name der Variablen

Beschreibung

Beispiel

COMPUTERNAME

Name des Computers

MOE

HOMEDRIVE

Laufwerk des Benutzerverzeichnisses

C:

HOMEPATH

Pfad des Benutzerverzeichnisses

\Users\Christian

OS

Name des Betriebssystems4

Windows_NT

PATH

Suchpfad

C:\windows\SYSTEM32;

C:\windows …

PATHEXT

Dateiendungen, die für ausführbare Programme stehen

.COM;.EXE;.BAT;.CMD;.VBS; .VBE;.JS;.JSE;.WSF;.WSH;.MSC

SYSTEMDRIVE

Laufwerk des Betriebssystems

C:

TEMP und auch TMP

temporäres Verzeichnis

C:\Users\CHRIST~1\AppData\Local\Temp

USERDOMAIN

Domäne des Benutzers

MOE

USERNAME

Name des Nutzers

Christian

USERPROFILE

Profilverzeichnis

C:\Users\Christian

WINDIR

Verzeichnis des Betriebssystems

C:\windows

Tabelle 15.6    Auswahl einiger unter Windows verfügbarer Umgebungsvariablen

Einige der Variablen sind auch über die System-Properties (System.getProperties(), System.getProperty(…)) erreichbar.

[zB]  Beispiel

Gib die Umgebungsvariablen des Systems aus:

Map<String,String> map = System.getenv();

map.forEach( (k, v) -> System.out.printf( "%s=%s%n", k, v ) );

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java ist auch eine Insel Java ist auch eine Insel

Jetzt Buch bestellen


 Buchempfehlungen
Zum Rheinwerk-Shop: Captain CiaoCiao erobert Java

Captain CiaoCiao erobert Java




Zum Rheinwerk-Shop: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Objektorientierte Programmierung

Objektorientierte Programmierung




 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2021

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.

 

[Rheinwerk Computing]



Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de



Cookie-Einstellungen ändern