diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Reference Architectures and Patterns/hjp5/html/k100110.html | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100110.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100110.html | 817 |
1 files changed, 817 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100110.html b/Master/Reference Architectures and Patterns/hjp5/html/k100110.html new file mode 100644 index 0000000..d0be778 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100110.html @@ -0,0 +1,817 @@ +<html>
+<head>
+<title>
+Handbuch der Java-Programmierung, 5. Auflage
+</title>
+</head>
+<body>
+<a name="startofbody"></a>
+<script language="JavaScript" src="hjp4lib.js">
+</script>
+<script language="JavaScript">
+installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100107.html;106,k100109.html;107,k100111.html;108,k100114.html");
+</script>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100107.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100109.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100111.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100114.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">Kapitel 16 - Utility-Klassen I
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id016003"></a>
+<h2>16.3 Die Klasse System </h2>
+<hr>
+<ul>
+<li><a href="k100110.html#sectlevel2id016003">16.3 Die Klasse System</a>
+<ul>
+<li><a href="k100110.html#systemproperties">16.3.1 System-Properties</a>
+<li><a href="k100110.html#inerrout">16.3.2 in, err und out</a>
+<li><a href="k100110.html#sectlevel3id016003003">16.3.3 exit</a>
+<li><a href="k100110.html#sectlevel3id016003004">16.3.4 gc</a>
+<li><a href="k100110.html#currenttimemillis">16.3.5 currentTimeMillis</a>
+<li><a href="k100110.html#sectlevel3id016003006">16.3.6 arraycopy</a>
+</ul>
+</ul>
+<hr>
+
+<p>
+Neben den bisher vorgestellten Datenstrukturen des Pakets <a href="index_j.html#ixb100127"><font color=#000080><tt>java.util</tt></font></a>
+gibt es in <a href="index_j.html#ixb100188"><font color=#000080><tt>java.lang</tt></font></a>
+eine Klasse <a name="ixa101078"><a href="index_s.html#ixb100435"><font color=#000080><tt>System</tt></font></a></a>,
+die eine Reihe nützlicher Hilfsmittel zur Verfügung stellt.
+Die wichtigsten von ihnen sollen in den folgenden Abschnitten besprochen
+werden.
+
+<!-- Section -->
+
+<a name="systemproperties"></a>
+<h3>16.3.1 <a name="ixa101079">System-Properties</a></h3>
+
+<p>
+In Java gibt es keine Möglichkeit, direkt auf die <i>Umgebungsvariablen</i>
+eines Programms zuzugreifen. Ein solcher Zugriff wurde von den Java-Designern
+als nichtportabel angesehen und statt dessen durch das Konzept der
+<i>Properties</i> ersetzt. Properties sind Listen von <i>Eigenschaften</i>,
+die dem Programm vom Java-Laufzeitsystem zur Verfügung gestellt
+werden. Jede Eigenschaft besitzt einen Namen, unter dem auf sie zugegriffen
+werden kann. Das Java-Laufzeitsystem stellt standardmäßig
+die folgenden Properties zur Verfügung: <a name="tableid016002"></a>
+
+<p>
+<table cols=2 border width=100%>
+
+<tr>
+<td valign=top align=left width=25%><b>Property</b></td>
+<td valign=top align=left width=75%><b>Bedeutung </b></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101080"><a href="index_j.html#ixb100822"><font color=#000080><tt>java.version</tt></font></a></a></td>
+<td valign=top align=left>Java-Versionsnummer </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101081"><a href="index_j.html#ixb100823"><font color=#000080><tt>java.vendor</tt></font></a></a></td>
+<td valign=top align=left>Herstellerspezifische Zeichenkette </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101082"><a href="index_j.html#ixb100824"><font color=#000080><tt>java.vendor.url</tt></font></a></a></td>
+<td valign=top align=left>URL (also ein Internet-Link) zum Hersteller
+</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101083"><a href="index_j.html#ixb100825"><font color=#000080><tt>java.home</tt></font></a></a></td>
+<td valign=top align=left>Installationsverzeichnis </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101084"><a href="index_j.html#ixb100826"><font color=#000080><tt>java.class.version</tt></font></a></a></td>
+<td valign=top align=left>Versionsnummer der Java-Klassenbibliothek
+</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101085"><a href="index_j.html#ixb100827"><font color=#000080><tt>java.class.path</tt></font></a></a></td>
+<td valign=top align=left>Aktueller Klassenpfad </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101086"><a href="index_o.html#ixb100828"><font color=#000080><tt>os.name</tt></font></a></a></td>
+<td valign=top align=left>Name des Betriebssystems </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101087"><a href="index_o.html#ixb100829"><font color=#000080><tt>os.arch</tt></font></a></a></td>
+<td valign=top align=left>Betriebssystem-Architektur </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101088"><a href="index_o.html#ixb100830"><font color=#000080><tt>os.version</tt></font></a></a></td>
+<td valign=top align=left>Versionsnummer des Betriebssystems </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101089"><a href="index_f.html#ixb100831"><font color=#000080><tt>file.separator</tt></font></a></a></td>
+<td valign=top align=left>Trennzeichen für die Bestandteile eines
+Pfadnamens </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101090"><a href="index_p.html#ixb100832"><font color=#000080><tt>path.separator</tt></font></a></a></td>
+<td valign=top align=left>Trennzeichen für die Laufwerksangabe
+eines Pfadnamens </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101091"><a href="index_l.html#ixb100833"><font color=#000080><tt>line.separator</tt></font></a></a></td>
+<td valign=top align=left>Zeichenkette für Zeilenschaltung </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101092"><a href="index_u.html#ixb100834"><font color=#000080><tt>user.name</tt></font></a></a></td>
+<td valign=top align=left>Name des angemeldeten Benutzers </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101093"><a href="index_u.html#ixb100835"><font color=#000080><tt>user.home</tt></font></a></a></td>
+<td valign=top align=left>Home-Verzeichnis </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101094"><a href="index_u.html#ixb100836"><font color=#000080><tt>user.dir</tt></font></a></a></td>
+<td valign=top align=left>Aktuelles Arbeitsverzeichnis </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101095"><a href="index_j.html#ixb100837"><font color=#000080><tt>java.vm.specification.version</tt></font></a></a></td>
+<td valign=top align=left>Version der VM-Spezifikation </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101096"><a href="index_j.html#ixb100838"><font color=#000080><tt>java.vm.specification.vendor</tt></font></a></a></td>
+<td valign=top align=left>Hersteller der VM-Spezifikation </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101097"><a href="index_j.html#ixb100839"><font color=#000080><tt>java.vm.specification.name</tt></font></a></a></td>
+<td valign=top align=left>Bezeichnung der VM-Spezifikation </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101098"><a href="index_j.html#ixb100840"><font color=#000080><tt>java.vm.version</tt></font></a></a></td>
+<td valign=top align=left>VM-Version </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101099"><a href="index_j.html#ixb100841"><font color=#000080><tt>java.vm.vendor</tt></font></a></a></td>
+<td valign=top align=left>Hersteller der VM </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101100"><a href="index_j.html#ixb100842"><font color=#000080><tt>java.vm.name</tt></font></a></a></td>
+<td valign=top align=left>Name der VM-Implementierung </td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101101"><a href="index_j.html#ixb100843"><font color=#000080><tt>java.specification.version</tt></font></a></a></td>
+<td valign=top align=left>Version der Spezifikation der Laufzeitumgebung
+</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101102"><a href="index_j.html#ixb100844"><font color=#000080><tt>java.specification.vendor</tt></font></a></a></td>
+<td valign=top align=left>Hersteller der Spezifikation der Laufzeitumgebung
+</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa101103"><a href="index_j.html#ixb100845"><font color=#000080><tt>java.specification.name</tt></font></a></a></td>
+<td valign=top align=left>Bezeichnung der Spezifikation der Laufzeitumgebung
+</td></tr>
+</table>
+<p><i>
+Tabelle 16.2: Standard-Properties </i></p>
+
+<p>
+Für den Zugriff auf diese Eigenschaften steht die Klasse <a name="ixa101104"><a href="index_p.html#ixb100703"><font color=#000080><tt>Properties</tt></font></a></a>
+aus dem Paket <a href="index_j.html#ixb100127"><font color=#000080><tt>java.util</tt></font></a>
+zur Verfügung. Sie bietet die Möglichkeit, Property-Listen
+zu erzeugen, mit Werten zu füllen und vorhandene Werte auszulesen.
+Die Klasse <a href="index_p.html#ixb100703"><font color=#000080><tt>Properties</tt></font></a>
+ist eine Ableitung der Klasse <a href="index_h.html#ixb100419"><font color=#000080><tt>Hashtable</tt></font></a>
+und stellt damit eine Tabelle von Schlüssel-/Wertepaaren dar.
+
+<p>
+Für den Zugriff auf einzelne Properties reicht meist die einfach
+zu bedienende Klassenmethode <a name="ixa101105"><a href="index_g.html#ixb100704"><font color=#000080><tt>getProperty</tt></font></a></a>
+der Klasse <a href="index_s.html#ixb100435"><font color=#000080><tt>System</tt></font></a>
+in <a href="index_j.html#ixb100188"><font color=#000080><tt>java.lang</tt></font></a>
+aus:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public static String getProperty(String key)
+public static String getProperty(String key, String default)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/System.html" onClick="this.href=getApiDoc('java.lang.System')"><font color="#660066" size=-1>java.lang.System</font></a></td>
+</tr>
+</table>
+
+<p>
+Die erste Variante liefert die Eigenschaft mit dem Namen <font color="#000077"><tt>key</tt></font>
+in Form einer Zeichenkette. Falls keine Eigenschaft mit diesem Namen
+gefunden wurde, wird <a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>
+zurückgegeben. Die zweite Variante erlaubt die Übergabe
+eines Standardwertes. Der Unterschied zur ersten Variante besteht
+darin, dass nicht <a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>,
+sondern der Standardwert zurückgegeben wird, wenn die gesuchte
+Eigenschaft nicht gefunden wurde.
+
+<p>
+Die Methode <a name="ixa101106"><a href="index_g.html#ixb100846"><font color=#000080><tt>getProperties</tt></font></a></a>
+liefert das komplette <a href="index_p.html#ixb100703"><font color=#000080><tt>Properties</tt></font></a>-Objekt
+mit den System-Properties:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public static Properties getProperties()
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/System.html" onClick="this.href=getApiDoc('java.lang.System')"><font color="#660066" size=-1>java.lang.System</font></a></td>
+</tr>
+</table>
+
+<p>
+Das folgende Programm gibt eine Liste aller System-Properties auf
+dem Bildschirm aus. Es verwendet dazu zunächst die Methode <a href="index_g.html#ixb100846"><font color=#000080><tt>getProperties</tt></font></a>,
+um das System-<a href="index_p.html#ixb100703"><font color=#000080><tt>Properties</tt></font></a>-Objekt
+zu beschaffen. Anschließend erzeugt es durch Aufruf von <a name="ixa101107"><a href="index_p.html#ixb100705"><font color=#000080><tt>propertyNames</tt></font></a></a>
+einen Enumerator, mit dem alle Schlüsselwerte durchlaufen werden
+können und mit dem durch Aufruf von <a href="index_g.html#ixb100704"><font color=#000080><tt>getProperty</tt></font></a>
+der zugehörige Wert ermittelt werden kann. Auf diese Weise listet
+das Programm alle verfügbaren System-Properties auf (das sind
+in der Regel sehr viel mehr als die plattformübergreifend spezifizierten):
+<a name="listingid016004"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1604.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.util.*;
+<font color="#555555">004 </font>
+<font color="#555555">005 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1604
+<font color="#555555">006 </font>{
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> Properties sysprops = System.getProperties();
+<font color="#555555">010 </font> Enumeration propnames = sysprops.propertyNames();
+<font color="#555555">011 </font> <font color="#0000AA">while</font> (propnames.hasMoreElements()) {
+<font color="#555555">012 </font> String propname = (String)propnames.nextElement();
+<font color="#555555">013 </font> System.out.println(
+<font color="#555555">014 </font> propname + <font color="#0000FF">"="</font> + System.getProperty(propname)
+<font color="#555555">015 </font> );
+<font color="#555555">016 </font> }
+<font color="#555555">017 </font> }
+<font color="#555555">018 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1604.java"><font color="#000055" size=-1>Listing1604.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 16.4: Ausgeben der System-Properties</i></p>
+
+
+<!-- Section -->
+<a name="inerrout"></a>
+<h3>16.3.2 in, err und out </h3>
+
+<p>
+In den vorangegangenen Kapiteln wurde schon häufig der Aufruf
+<a name="ixa101108"><a href="index_s.html#ixb100163"><font color=#000080><tt>System.out.println</tt></font></a></a>
+verwendet, um Daten auf die Standardausgabe bzw. in ein Debug-Fenster
+auszugeben. Diese Anweisung ruft die Methode <a name="ixa101109"><a href="index_p.html#ixb100555"><font color=#000080><tt>println</tt></font></a></a>
+des Objekts <a name="ixa101110"><a href="index_o.html#ixb100115"><font color=#000080><tt>out</tt></font></a></a>
+der Klasse <a href="index_s.html#ixb100435"><font color=#000080><tt>System</tt></font></a>
+auf. Dabei ist <a href="index_o.html#ixb100115"><font color=#000080><tt>out</tt></font></a>
+eine statische Variable vom Typ <a name="ixa101111"><a href="index_p.html#ixb100114"><font color=#000080><tt>PrintStream</tt></font></a></a>,
+die beim Starten des Programms so initialisiert wird, dass ihre Ausgabe
+auf die Standardausgabe geleitet wird.
+
+<p>
+Analog zu <a href="index_o.html#ixb100115"><font color=#000080><tt>out</tt></font></a>
+gibt es die statischen Variablen <a name="ixa101112"><a href="index_e.html#ixb100847"><font color=#000080><tt>err</tt></font></a></a>
+und <a name="ixa101113"><a href="index_i.html#ixb100848"><font color=#000080><tt>in</tt></font></a></a>.
+Dabei dient <a href="index_e.html#ixb100847"><font color=#000080><tt>err</tt></font></a>
+zur Ausgabe von Fehlermeldungen, und <a href="index_i.html#ixb100848"><font color=#000080><tt>in</tt></font></a>
+ist ein Standardeingabekanal, der dazu verwendet werden kann, Eingaben
+von der Tastatur zu lesen.
+
+<p>
+Mit Hilfe der Methoden <a name="ixa101114"><a href="index_s.html#ixb100849"><font color=#000080><tt>setIn</tt></font></a></a>,
+<a name="ixa101115"><a href="index_s.html#ixb100850"><font color=#000080><tt>setOut</tt></font></a></a>
+und <a name="ixa101116"><a href="index_s.html#ixb100851"><font color=#000080><tt>setErr</tt></font></a></a>
+ist es sogar möglich, die Standardein- und -ausgabe aus dem Programm
+heraus umzuleiten:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public static void setIn(InputStream in)
+
+public static void setOut(PrintStream out)
+
+public static void setErr(PrintStream err)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/System.html" onClick="this.href=getApiDoc('java.lang.System')"><font color="#660066" size=-1>java.lang.System</font></a></td>
+</tr>
+</table>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Die Verwendung dieser Klassenvariablen ist im Grunde genommen nicht
+konform mit dem Dialogkonzept einer GUI-Anwendung. Ihr Einsatz kann
+aber immer dann sinnvoll sein, wenn Java-Programme geschrieben werden
+sollen, die keine ausgefeilte Oberfläche benötigen. In diesem
+Fall sind sie ein nützliches Hilfsmittel, um einfache Ein-/Ausgaben
+ohne großen Aufwand realisieren zu können. Bereits in <a href="k100018.html#kapitelwieweiter">Kapitel 3</a>
+wurde gezeigt, wie man diese Routinen zur Ein- und Ausgabe verwenden
+kann. Weitere Informationen darüber sind in <a href="k100125.html#kapitelbytestreams">Kapitel 19</a>
+zu finden, das sich mit Byte-Streams beschäftigt.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel3id016003003"></a>
+<h3>16.3.3 exit </h3>
+
+<p>
+Auch Aufrufe der Methode <a name="ixa101117"><a href="index_e.html#ixb100651"><font color=#000080><tt>System.exit</tt></font></a></a>
+sind uns schon begegnet:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public static void exit(int status)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/System.html" onClick="this.href=getApiDoc('java.lang.System')"><font color="#660066" size=-1>java.lang.System</font></a></td>
+</tr>
+</table>
+
+<p>
+Mit <a href="index_e.html#ixb100651"><font color=#000080><tt>System.exit</tt></font></a>
+wird das laufende Programm beendet. Der Aufrufparameter <font color="#000077"><tt>status</tt></font>
+dient als Fehleranzeige und wird als Exitcode an den Aufrufer des
+Programms zurückgegeben. Gemäß Konvention zeigt dabei
+ein Wert größer oder gleich 1 einen Fehler während
+der Programmausführung an, während 0 ein fehlerfreies Programmende
+signalisiert.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Neben der Methoden <font color="#000077"><tt>System.exit</tt></font>
+bietet die weiter unten beschriebene Klasse <font color="#000077"><tt>Runtime</tt></font>
+auch die Methode <a href="index_h.html#ixb100852"><font color=#000080><tt>System.halt</tt></font></a>
+an, bei der die Virtuelle Machine sofort angehalten wird. Im Unterschied
+zu <font color="#000077"><tt>Runtime.halt</tt></font> werden dabei
+weder <font color="#000077"><tt>finalize</tt></font> -Methoden noch
+<font color="#000077"><tt>finally</tt></font>-Zweige abgearbeitet.
+Dies kann - z.B. beim Zugriff auf eine Datenbank - dazu führen,
+dass externe Ressourcen nicht zurückgegeben werden. Sie sollten
+deshalb auf die Verwendung von <font color="#000077"><tt>Runtime.halt</tt></font>
+verzichten. </td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
+<tr>
+<td><font color="#FFFFFF"> Warnung </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel3id016003004"></a>
+<h3>16.3.4 gc </h3>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public static void gc()
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/System.html" onClick="this.href=getApiDoc('java.lang.System')"><font color="#660066" size=-1>java.lang.System</font></a></td>
+</tr>
+</table>
+
+<p>
+Ein Aufruf der Methode <a name="ixa101118"><a href="index_g.html#ixb100853"><font color=#000080><tt>gc</tt></font></a></a>
+führt einen expliziten Aufruf des <a name="ixa101119">Garbage Collectors</a>
+durch. Dieser sucht dann nach freiem Speicher und gibt diesen an das
+Laufzeitsystem zurück. Normalerweise ist ein Aufruf dieser Methode
+nicht erforderlich, denn der Garbage Collector läuft ständig
+als niedrig priorisierter Thread im Hintergrund. Der Aufruf von <a href="index_g.html#ixb100853"><font color=#000080><tt>gc</tt></font></a>
+ist immer dann sinnvoll, wenn eine explizite Kontrolle über den
+Zeitpunkt der Speicherfreigabe gewünscht ist.
+
+<!-- Section -->
+
+<a name="currenttimemillis"></a>
+<h3>16.3.5 currentTimeMillis </h3>
+
+<p>
+Die Methode <a name="ixa101120"><a href="index_c.html#ixb100854"><font color=#000080><tt>currentTimeMillis</tt></font></a></a>
+liefert die Anzahl der Millisekunden, die zum Zeitpunkt des Aufrufs
+seit Mitternacht des 1.1.1970 vergangen sind:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public static long currentTimeMillis()
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/System.html" onClick="this.href=getApiDoc('java.lang.System')"><font color="#660066" size=-1>java.lang.System</font></a></td>
+</tr>
+</table>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Ob dabei tatsächlich eine Auflösung von einer Millisekunde
+erreicht wird, ist von der konkreten Java-Implementierung abhängig.
+In PC-basierten Java-Systemen orientiert sie sich meist an der Auflösung
+des System-Timers. Dieser wird 18,2 mal pro Sekunde aufgerufen, so
+dass die Auflösung damit bei etwa 55 ms. liegt.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Mit dem folgenden Beispielprogramm kann die Auflösung des System-Timers
+ermittelt werden:
+<a name="listingid016005"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1605.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1605
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">006 </font> {
+<font color="#555555">007 </font> <font color="#006699">long</font> t1, t2;
+<font color="#555555">008 </font> <font color="#006699">int</font> actres, sumres = 0, i = 0;
+<font color="#555555">009 </font> <font color="#0000AA">while</font> (<font color="#006699">true</font>) {
+<font color="#555555">010 </font> ++i;
+<font color="#555555">011 </font> t1 = System.currentTimeMillis();
+<font color="#555555">012 </font> <font color="#0000AA">while</font> (<font color="#006699">true</font>) {
+<font color="#555555">013 </font> t2 = System.currentTimeMillis();
+<font color="#555555">014 </font> <font color="#0000AA">if</font> (t2 != t1) {
+<font color="#555555">015 </font> actres = (<font color="#006699">int</font>)(t2 - t1);
+<font color="#555555">016 </font> <font color="#0000AA">break</font>;
+<font color="#555555">017 </font> }
+<font color="#555555">018 </font> }
+<font color="#555555">019 </font> sumres += actres;
+<font color="#555555">020 </font> System.out.print(<font color="#0000FF">"it="</font>+i+<font color="#0000FF">", "</font>);
+<font color="#555555">021 </font> System.out.print(<font color="#0000FF">"actres="</font>+actres+<font color="#0000FF">" msec., "</font>);
+<font color="#555555">022 </font> System.out.print(<font color="#0000FF">"avgres="</font>+(sumres/i)+<font color="#0000FF">" msec."</font>);
+<font color="#555555">023 </font> System.out.println(<font color="#0000FF">""</font>);
+<font color="#555555">024 </font> <font color="#0000AA">try</font> {
+<font color="#555555">025 </font> Thread.sleep(500);
+<font color="#555555">026 </font> } <font color="#0000AA">catch</font> (InterruptedException e) {
+<font color="#555555">027 </font> <font color="#00AA00">//nichts</font>
+<font color="#555555">028 </font> }
+<font color="#555555">029 </font> }
+<font color="#555555">030 </font> }
+<font color="#555555">031 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1605.java"><font color="#000055" size=-1>Listing1605.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 16.5: Die Auflösung des System-Timers bestimmen</i></p>
+
+<p>
+Das Programm bestimmt zunächst die aktuelle Systemzeit und merkt
+sich den Wert in der Variablen <font color="#000077"><tt>t1</tt></font>.
+Nun wird die Systemzeit in einer Schleife erneut so oft gemessen,
+bis sie sich geändert hat. Die Differenz zwischen beiden Werten
+wird als Auflösung des aktuellen Durchgangs angesehen und der
+Variablen <font color="#000077"><tt>actres</tt></font> zugewiesen.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Um eine größere Genauigkeit zu erzielen, führt das
+Programm die Bestimmung der Auflösung mit Hilfe der äußeren
+Schleife viele Male durch. Die dabei jeweils ermittelte Auflösung
+wird in der Variablen <font color="#000077"><tt>sumres</tt></font>
+addiert und durch Division durch die Anzahl der Schleifendurchläufe
+zur Ermittlung des gleitenden Durchschnitts verwendet. Das so errechnete
+Ergebnis pendelt sich tatsächlich bereits nach wenigen Durchläufen
+auf den vorausgesagten Wert von 55 ms. ein:</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+<font color="#333300">
+<pre>
+it=1, actres=60 msec., avgres=60 msec.
+it=2, actres=50 msec., avgres=55 msec.
+it=3, actres=50 msec., avgres=53 msec.
+it=4, actres=50 msec., avgres=52 msec.
+it=5, actres=50 msec., avgres=52 msec.
+it=6, actres=50 msec., avgres=51 msec.
+...
+it=65, actres=50 msec., avgres=55 msec.
+it=66, actres=50 msec., avgres=55 msec.
+it=67, actres=50 msec., avgres=55 msec.
+it=68, actres=60 msec., avgres=55 msec.
+it=69, actres=60 msec., avgres=55 msec.
+it=70, actres=60 msec., avgres=55 msec.
+</pre>
+</font>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Interessanterweise bietet die Methode <a name="ixa101121"><a href="index_s.html#ixb100855"><font color=#000080><tt>sleep</tt></font></a></a>
+der Klasse <a href="index_t.html#ixb100591"><font color=#000080><tt>Thread</tt></font></a>
+(sie wird in <a href="k100145.html#weiterethreadmethoden">Abschnitt 22.2.4</a>
+beschrieben) auf aktuellen SUN-JDKs unter Windows mit etwa 1 ms. eine
+wesentlich höhere Auflösung als <a href="index_c.html#ixb100854"><font color=#000080><tt>currentTimeMillis</tt></font></a>.
+Diese Eigenschaft ist allerdings nicht dokumentiert und kann von Interpreter
+zu Interpreter sehr unterschiedlich sein. Selbst auf ein und derselben
+Java-Maschine kann es durch unterschiedliche Lastsituationen zu Abweichungen
+kommen. Das folgende Programm ermittelt die Auflösung von <a href="index_s.html#ixb100855"><font color=#000080><tt>sleep</tt></font></a>:</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+<a name="listingid016006"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1606.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1606
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">long</font> testSleep(<font color="#006699">int</font> millis)
+<font color="#555555">006 </font> {
+<font color="#555555">007 </font> <font color="#0000AA">final</font> <font color="#006699">int</font> MINDURATION = 3000;
+<font color="#555555">008 </font> <font color="#006699">int</font> cnt = (millis >= MINDURATION ? 1 : MINDURATION/millis);
+<font color="#555555">009 </font> <font color="#006699">long</font> start = System.currentTimeMillis();
+<font color="#555555">010 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < cnt; ++i) {
+<font color="#555555">011 </font> <font color="#0000AA">try</font> {
+<font color="#555555">012 </font> Thread.sleep(millis);
+<font color="#555555">013 </font> } <font color="#0000AA">catch</font> (InterruptedException e) {
+<font color="#555555">014 </font> }
+<font color="#555555">015 </font> }
+<font color="#555555">016 </font> <font color="#006699">long</font> end = System.currentTimeMillis();
+<font color="#555555">017 </font> <font color="#0000AA">return</font> (end - start) / cnt;
+<font color="#555555">018 </font> }
+<font color="#555555">019 </font>
+<font color="#555555">020 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">021 </font> {
+<font color="#555555">022 </font> <font color="#0000AA">final</font> <font color="#006699">int</font> DATA[] = {345, 27, 1, 1962, 2, 8111, 6, 89, 864};
+<font color="#555555">023 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < DATA.length; ++i) {
+<font color="#555555">024 </font> System.out.println(<font color="#0000FF">"Aufruf von sleep("</font> + DATA[i] + <font color="#0000FF">")"</font>);
+<font color="#555555">025 </font> <font color="#006699">long</font> result = testSleep(DATA[i]);
+<font color="#555555">026 </font> System.out.print(<font color="#0000FF">" Ergebnis: "</font> + result);
+<font color="#555555">027 </font> <font color="#006699">double</font> prec = ((<font color="#006699">double</font>)result / DATA[i] - 1.0) * 100;
+<font color="#555555">028 </font> System.out.println(<font color="#0000FF">" ("</font> + (prec > 0 ? <font color="#0000FF">"+"</font>: <font color="#0000FF">""</font>) + prec + <font color="#0000FF">" %)"</font>);
+<font color="#555555">029 </font> }
+<font color="#555555">030 </font> }
+<font color="#555555">031 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1606.java"><font color="#000055" size=-1>Listing1606.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 16.6: Die Auflösung von Thread.sleep bestimmen</i></p>
+
+<p>
+Ein Aufruf unter dem JDK 1.4 auf einem Windows-98-System im Leerlauf
+ergab folgendes Ergebnis:
+<font color="#333300">
+<pre>
+Aufruf von sleep(345)
+ Ergebnis: 343 (-0.5797101449275366 %)
+Aufruf von sleep(27)
+ Ergebnis: 27 (0.0 %)
+Aufruf von sleep(1)
+ Ergebnis: 1 (0.0 %)
+Aufruf von sleep(1962)
+ Ergebnis: 1920 (-2.1406727828746197 %)
+Aufruf von sleep(2)
+ Ergebnis: 2 (0.0 %)
+Aufruf von sleep(8111)
+ Ergebnis: 8080 (-0.3821970163974897 %)
+Aufruf von sleep(6)
+ Ergebnis: 6 (0.0 %)
+Aufruf von sleep(89)
+ Ergebnis: 89 (0.0 %)
+Aufruf von sleep(864)
+ Ergebnis: 860 (-0.462962962962965 %)
+</pre>
+</font>
+
+
+<!-- Section -->
+<a name="sectlevel3id016003006"></a>
+<h3>16.3.6 arraycopy </h3>
+
+<p>
+Als letzte Methode der Klasse <a href="index_s.html#ixb100435"><font color=#000080><tt>System</tt></font></a>
+soll <a name="ixa101122"><a href="index_a.html#ixb100856"><font color=#000080><tt>arraycopy</tt></font></a></a>
+vorgestellt werden:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public static native void arraycopy(
+ Object src, int src_position,
+ Object dst, int dst_position,
+ int length
+)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/System.html" onClick="this.href=getApiDoc('java.lang.System')"><font color="#660066" size=-1>java.lang.System</font></a></td>
+</tr>
+</table>
+
+<p>
+<a href="index_a.html#ixb100856"><font color=#000080><tt>arraycopy</tt></font></a>
+kann dazu verwendet werden, Arrays oder Teile davon zu kopieren. Dabei
+können die Elemente sowohl innerhalb desselben Arrays als auch
+in ein anderes Array kopiert werden. Falls innerhalb desselben Arrays
+kopiert wird, dürfen sich Quell- und Zielbereich auch überlappen.
+Die Methode arbeitet sowohl mit elementaren als auch mit Objekttypen,
+Ziel- und Quellarray müssen lediglich zuweisungskompatibel sein.
+Da die Methode in C bzw. Assembler implementiert ist, arbeitet sie
+recht performant.
+
+<p>
+Als erste Argumente werden das Quellarray <font color="#000077"><tt>src</tt></font>
+und die Startposition <font color="#000077"><tt>src_position</tt></font>
+angegeben. Anschließend folgen das Zielarray <font color="#000077"><tt>dst</tt></font>
+und die Zielposition <font color="#000077"><tt>dst_position</tt></font>.
+Als letztes Argument wird die Länge <a href="index_l.html#ixb100275"><font color=#000080><tt>length</tt></font></a>
+des zu kopierenden Bereichs angegeben. Falls die Argumente auf Elemente
+zeigen, die außerhalb des Arrays liegen, wird eine Ausnahme
+des Typs <a name="ixa101123"><a href="index_a.html#ixb100857"><font color=#000080><tt>ArrayIndexOutOfBoundsException</tt></font></a></a>
+ausgelöst. Falls ein Element aufgrund eines Typfehlers nicht
+gespeichert werden kann, gibt es eine Ausnahme des Typs <a name="ixa101124"><a href="index_a.html#ixb100858"><font color=#000080><tt>ArrayStoreException</tt></font></a></a>.
+
+<p>
+Das folgende Programm zeigt die Verwendung von <a href="index_a.html#ixb100856"><font color=#000080><tt>arraycopy</tt></font></a>
+an einem einfachen Beispiel:
+<a name="listingid016007"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1607.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1607
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">006 </font> {
+<font color="#555555">007 </font> <font color="#006699">int</font>[] ar = {0,0,0,0,0,0,0,0,0,0};
+<font color="#555555">008 </font>
+<font color="#555555">009 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < 10; ++i) {
+<font color="#555555">010 </font> System.arraycopy(ar,0,ar,1,9);
+<font color="#555555">011 </font> ar[0] = i;
+<font color="#555555">012 </font> }
+<font color="#555555">013 </font> System.out.print(<font color="#0000FF">"ar = "</font>);
+<font color="#555555">014 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < 10; ++i) {
+<font color="#555555">015 </font> System.out.print(ar[i] + <font color="#0000FF">" "</font>);
+<font color="#555555">016 </font> }
+<font color="#555555">017 </font> System.out.println(<font color="#0000FF">""</font>);
+<font color="#555555">018 </font> }
+<font color="#555555">019 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1607.java"><font color="#000055" size=-1>Listing1607.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 16.7: Verwendung von System.arraycopy</i></p>
+
+<p>
+Das Programm füllt ein 10-elementiges Array von Ganzzahlen, das
+zunächst nur Nullen enthält, mit den Zahlen 0 bis 9. Dabei
+wird jeweils durch Kopieren der ersten neun Elemente an die zweite
+Position des Arrays an der ersten Position Platz gemacht, um dort
+den Inhalt des fortlaufenden Schleifenzählers abzulegen. Nach
+10 Durchläufen stehen somit die Zahlen 0 bis 9 verkehrt herum
+im Array. Die Ausgabe des Programms ist:
+<font color="#333300">
+<pre>
+ar = 9 8 7 6 5 4 3 2 1 0
+</pre>
+</font>
+<hr>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
+Wesley, Version 5.0.1
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100107.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100109.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100111.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100114.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">© 1998, 2007 Guido Krüger & Thomas
+Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
+</table>
+<a name="endofbody"></a>
+</body>
+</html>
|
