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/k100087.html | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100087.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100087.html | 601 |
1 files changed, 601 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100087.html b/Master/Reference Architectures and Patterns/hjp5/html/k100087.html new file mode 100644 index 0000000..700d5bd --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100087.html @@ -0,0 +1,601 @@ +<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,k100083.html;106,k100086.html;107,k100088.html;108,k100090.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="k100083.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100086.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100088.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.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 13 - Strukturierung von Java-Programmen
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id013004"></a>
+<h2>13.4 Auslieferung von Java-Programmen </h2>
+<hr>
+<ul>
+<li><a href="k100087.html#sectlevel2id013004">13.4 Auslieferung von Java-Programmen</a>
+<ul>
+<li><a href="k100087.html#sectionclasspath">13.4.1 Weitergabe des Bytecodes</a>
+<ul>
+<li><a href="k100087.html#sectlevel4id013004001001">Direkte Weitergabe der Klassendateien</a>
+<li><a href="k100087.html#subsectionclasspath">Verwendung eines jar-Archivs</a>
+<li><a href="k100087.html#sectlevel4id013004001003">Ausführbare jar-Archive</a>
+</ul>
+<li><a href="k100087.html#sectlevel3id013004002">13.4.2 Einbinden von Ressourcen-Dateien</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectionclasspath"></a>
+<h3>13.4.1 Weitergabe des Bytecodes </h3>
+
+
+<!-- Section -->
+<a name="sectlevel4id013004001001"></a>
+<h4>Direkte Weitergabe der Klassendateien </h4>
+
+<p>
+Der ausführbare Programmcode einer Java-Applikation befindet
+sich in den vom Compiler erzeugten <font color="#660099">.class</font>-Dateien.
+Sie sind der wichtigste Bestandteil bei der Auslieferung eines Java-Programms.
+Wir werden uns in diesem Abschnitt ansehen, auf welche Weise die Klassendateien
+weitergegeben werden können und was dabei zu beachten ist. Neben
+den Klassendateien müssen mitunter auch zusätzliche Dateien
+mit Übersetzungstexten, Fehlermeldungen, Icons oder Bilddateien
+weitergegeben werden. Wie diese zusammen mit den Klassendateien ausgeliefert
+und verwendet werden können, zeigt der nächste Abschnitt.
+<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>
+Die Ausführungen in diesem und dem nächsten Abschnitt sind
+möglicherweise schwierig zu verstehen, denn sie setzen Kenntnisse
+voraus, die teilweise erst in späteren Kapiteln vermittelt werden.
+Wegen ihres engen thematischen Bezuges zum vorliegenden Kapitel sind
+sie hier dennoch richtig aufgehoben, und Sie sollten den Ausführungen
+zumindest in groben Zügen folgen können. Lesen Sie diese
+Abschnitte bei Bedarf einfach zu einem späteren Zeitpunkt noch
+einmal, und viele Dinge, die jetzt unklar sind, werden dann leicht
+zu verstehen sein.</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>
+
+<p>
+Die einfachste Möglichkeit, ein Java-Programm auszuliefern, besteht
+darin, die Klassendateien so zu belassen, wie sie sind, und sie entsprechend
+ihrer Paketstruktur auf das Zielsystem zu kopieren. Das Programm kann
+dann auf dem Zielsystem gestartet werden, indem der Java-Interpreter
+aus dem Installationsverzeichnis aufgerufen und der Name der zu startenden
+Klasse als Argument angegeben wird.
+
+<p>
+Als Beispiel wollen wir uns eine hypothetische Applikation ansehen,
+die aus folgenden Klassen besteht:
+<font color="#000077">
+<pre>
+com.gkrueger.app.App
+com.gkrueger.app.AppFrame
+com.gkrueger.util.Logger
+</pre>
+</font>
+
+<p>
+Die Klassen <font color="#000077"><tt>App</tt></font> und <font color="#000077"><tt>AppFrame</tt></font>
+befinden sich im Paket <font color="#000077"><tt>com.gkrueger.app</tt></font>
+und die Klasse <font color="#000077"><tt>Logger</tt></font> im Paket
+<font color="#000077"><tt>com.gkrueger.util</tt></font>. Ausgehend
+vom Basisverzeichnis, liegen die Klassendateien also in den Unterverzeichnissen
+<font color="#660099">com\gkrueger\app</font> und <font color="#660099">com\gkrueger\util</font>.
+Die <a href="index_m.html#ixb100150"><font color=#000080><tt>main</tt></font></a>-Methode
+befindet sich in der Klasse <font color="#000077"><tt>App</tt></font>.
+Soll das Programm auf dem Zielsystem beispielsweise im Verzeichnis
+<font color="#660099">c:\gkapp</font> installiert werden, müssen
+die drei Dateien wie folgt kopiert werden:
+<ul>
+<li><font color="#660099">App.class</font> nach <font color="#660099">c:\gkapp\com\gkrueger\app</font>
+<li><font color="#660099">AppFrame.class</font> nach <font color="#660099">c:\gkapp\com\gkrueger\app</font>
+<li><font color="#660099">Logger.class</font> nach <font color="#660099">c:\gkapp\com\gkrueger\util</font>
+</ul>
+
+<p>
+Das Programm kann dann aus dem Installationsverzeichnis <font color="#660099">c:\gkapp</font>
+durch Angabe des qualifizierten Klassennamens gestartet werden:
+<font color="#333300">
+<pre>
+java com.gkrueger.app.App
+</pre>
+</font>
+
+<p>
+Voraussetzung zum Starten der Applikation ist, dass der Klassenpfad
+korrekt gesetzt ist. Soll das Programm stets aus dem Installationsverzeichnis
+heraus gestartet werden, muss das aktuelle Verzeichnis ».«
+im <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
+enthalten sein (alternativ kann seit dem JDK 1.2 auch gar kein Klassenpfad
+gesetzt sein). Soll das Programm von beliebiger Stelle aus gestartet
+werden können, muss der Pfad des Installationsverzeichnisses
+<font color="#660099">c:\gkapp</font> in den Klassenpfad aufgenommen
+werden. Dazu kann entweder die Umgebungsvariable <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
+modifiziert oder der gewünschte Klassenpfad mit einer der Optionen
+<a name="ixa100828"><a href="index_0.html#ixb100182"><font color=#000080><tt>-cp</tt></font></a></a>
+oder <a name="ixa100829"><a href="index_0.html#ixb100183"><font color=#000080><tt>-classpath</tt></font></a></a>
+an den Java-Interpreter übergeben werden. Dafür wäre
+beispielsweise folgender Aufruf geeignet:
+<font color="#333300">
+<pre>
+java -cp c:\gkapp com.gkrueger.app.App
+</pre>
+</font>
+<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 Variante, bei der die Umgebungsvariable unverändert bleibt,
+ist natürlich die bessere, denn Modifikationen an Umgebungsvariablen
+beeinflussen möglicherweise auch andere Programme. Zudem hat
+die explizite und präzise Übergabe des Klassenpfades an
+den Interpreter den Vorteil, dass nicht versehentlich weitere Verzeichnisse
+im Klassenpfad enthalten sind und unerwünschte Nebeneffekte verursachen
+können.</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="subsectionclasspath"></a>
+<h4>Verwendung eines jar-Archivs </h4>
+
+<p>
+Noch einfacher wird die Installation, wenn anstelle der verschiedenen
+Klassendateien eine einzelne jar-Datei ausgeliefert wird. Auf dem
+Zielsystem spielt es dann keine Rolle mehr, aus welchem Verzeichnis
+heraus die Applikation aufgerufen wird und wie die <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>-Variable
+gesetzt ist. Weitere Hinweise zur Anwendung des jar-Programms finden
+sich in <a href="k100323.html#jarwerkzeug">Abschnitt 51.6</a>. Dort
+wird auch erläutert, wie <i>Applets</i> in jar-Dateien ausgeliefert
+werden können.
+
+<p>
+Angenommen, das Basisverzeichnis für die Programmentwicklung
+auf der Quellmaschine ist <font color="#660099">c:\prog\java</font>
+und die Klassendateien liegen in den Verzeichnissen <font color="#660099">c:\prog\java\com\gkrueger\app</font>
+und <font color="#660099">c:\prog\java\com\gkrueger\util</font>. Um
+eine jar-Datei zu unserem Beispielprojekt zu erstellen, ist aus dem
+Entwicklungsverzeichnis <font color="#660099">c:\prog\java</font>
+heraus folgendes <a href="index_j.html#ixb100146"><font color=#000080><tt>jar</tt></font></a>-Kommando
+abzusetzen:
+<font color="#333300">
+<pre>
+jar cvf myapp.jar com
+</pre>
+</font>
+
+<p>
+Dadurch werden alle Dateien aus dem Unterverzeichnis <font color="#660099">com</font>
+und allen darin enthaltenen Unterverzeichnissen unter Beibehaltung
+der Verzeichnishierarchie in die jar-Datei <font color="#660099">myapp.jar</font>
+kopiert. Um das Programm auf der Zielmaschine aufzurufen, reicht es
+aus, <font color="#660099">myapp.jar</font> an eine beliebige Stelle
+zu kopieren und den Java-Interpreter wie folgt zu starten:
+<font color="#333300">
+<pre>
+java -cp myapp.jar com.gkrueger.app.App
+</pre>
+</font>
+
+<p>
+Anstelle des Unterverzeichnisses mit den Klassendateien haben wir
+nun die jar-Datei im Klassenpfad angegeben. Für den Interpreter
+sind beide Varianten gleichwertig und er wird das Programm in der
+gleichen Weise wie zuvor starten. Vorteilhaft an dieser Vorgehensweise
+ist, dass auf der Zielmaschine nur noch eine einzige Datei benötigt
+wird und nicht mehr ein ganzes System von Verzeichnissen und Unterverzeichnissen
+wie zuvor. Das vereinfacht nicht nur die Installation, sondern erhöht
+auch ihre Haltbarkeit, denn einzelne Dateien können nicht mehr
+überschrieben werden oder verlorengehen.
+<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>
+Das oben beschriebene jar-Kommando kopiert <i>alle</i> Dateien aus
+dem <font color="#660099">com</font>-Unterverzeichnis und den darin
+enthaltenen Unterverzeichnissen in die jar-Datei. Dazu zählen
+natürlich auch die Quelldateien, sofern sie in denselben Verzeichnissen
+liegen. Da diese aber meist nicht mit ausgeliefert werden sollen,
+empfiehlt es sich, entweder die Klassendateien (unter Beibehaltung
+der Unterverzeichnisstruktur) zuvor in ein leeres Verzeichnis zu kopieren
+und das jar-Kommando von dort aus zu starten. Oder die Klassendateien
+werden schon bei der Entwicklung von den Quelltexten getrennt, indem
+beim Kompilieren die Option <a name="ixa100830"><a href="index_0.html#ixb100634"><font color=#000080><tt>-d</tt></font></a></a>
+verwendet wird.</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="sectlevel4id013004001003"></a>
+<h4>Ausführbare jar-Archive </h4>
+
+<p>
+Wir können sogar noch einen Schritt weitergehen und die jar-Datei
+selbst »ausführbar« machen. Dazu müssen wir eine
+<a name="ixa100831"><i>Manifest-Datei</i></a> erstellen, in der der
+Name der Klasse angegeben wird, die die <a href="index_m.html#ixb100150"><font color=#000080><tt>main</tt></font></a>-Methode
+enthält. Anschließend läßt sich die jar-Datei
+mit der Option <a name="ixa100832"><a href="index_0.html#ixb100636"><font color=#000080><tt>-jar</tt></font></a></a>
+des Interpreters ohne explizite Angabe der Hauptklasse starten.
+<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 <a name="ixa100831">Manifest-Datei</a> ist eine Hilfsdatei mit
+Informationen über den Inhalt der jar-Datei. Sie hat den Namen
+<font color="#660099">manifest.mf</font> und liegt im Unterverzeichnis
+<font color="#660099">meta-inf</font> des jar-Archivs<a name="ixa100833"></a>.
+Die Manifest-Datei kann mit einem normalen Texteditor erstellt und
+mit Hilfe der Option »m« in das jar-Archiv eingebunden werden.
+In unserem Fall muss sie lediglich einen Eintrag <a name="ixa100834"><a href="index_m.html#ixb100638"><font color=#000080><tt>Main-Class</tt></font></a></a>
+enthalten. Weitere Informationen zu Manifest-Dateien finden sich in
+<a href="k100282.html#integrationbeans">Abschnitt 44.3.3</a> bei der
+Beschreibung der Java-Beans-Architektur.</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>
+Wir erstellen also zunächst eine Textdatei <font color="#660099">manifest.txt</font>
+mit folgendem Inhalt (bitte mit einer Zeilenschaltung abschließen,
+sonst wird die Manifest-Datei nicht korrekt erstellt):
+<font color="#000077">
+<pre>
+Main-Class: com.gkrueger.app.App
+</pre>
+</font>
+
+<p>
+Nun kann das jar-Archiv erzeugt und die Manifest-Datei einbezogen
+werden:
+<font color="#333300">
+<pre>
+jar cvfm myapp.jar manifest.txt com
+</pre>
+</font>
+
+<p>
+Dieses Archiv kann nun mit Hilfe der Option <a href="index_0.html#ixb100636"><font color=#000080><tt>-jar</tt></font></a>
+ohne Angabe des Klassennamens gestartet werden:
+<font color="#333300">
+<pre>
+java -jar myapp.jar
+</pre>
+</font>
+
+<p>
+Auch jetzt verhält sich das Programm genauso wie in den beiden
+zuvor beschriebenen Beispielen. Diese Variante ist vor allem nützlich,
+wenn die komplette Applikation in einem einzigen jar-Archiv ausgeliefert
+wird und nur eine einzige <a href="index_m.html#ixb100150"><font color=#000080><tt>main</tt></font></a>-Methode
+enthält. Sie bietet sich beispielsweise für kleinere Programme,
+Beispiel- oder Testapplikationen an (die Demos des JDK sind beispielsweise
+in derartigen jar-Dateien untergebracht). Ist die Konfiguration dagegen
+komplizierter oder gibt es mehr als eine lauffähige Applikation
+in der jar-Datei, sollte der zuvor beschriebenen Variante der Vorzug
+gegeben werden.
+
+<!-- Section -->
+
+<a name="sectlevel3id013004002"></a>
+<h3>13.4.2 Einbinden von Ressourcen-Dateien </h3>
+
+<p>
+Wie eingangs erwähnt, benötigt ein Programm neben den Klassendateien
+meist weitere Dateien mit zusätzlichen Informationen. Wird auf
+diese ausschließlich lesend zugegriffen, wollen wir sie als
+<a name="ixa100835"><i>Ressourcen-Dateien</i></a> bezeichnen, also
+als Dateien, die dem Programm neben den Klassendateien als zusätzliche
+Informationslieferanten zur Laufzeit zur Verfügung stehen. Die
+Ressourcen-Dateien könnten zwar als separate Dateien ausgeliefert
+und mit den Klassen zur Dateiverarbeitung eingelesen werden (diese
+werden ab <a href="k100120.html#kapitelcharacterstreams">Kapitel 18</a>
+vorgestellt). Das hätte jedoch den Nachteil, dass sich nicht
+mehr alle benötigten Dateien in einem jar-Archiv befinden würden
+und die Auslieferung dadurch verkompliziert würde.
+
+<p>
+Glücklicherweise gibt es im JDK die Möglichkeit, auch Ressourcen-Dateien
+in jar-Archiven unterzubringen und zur Laufzeit daraus einzulesen.
+Mit dem Klassenlader steht das dafür erforderliche Werkzeug allen
+Java-Programmen standardmäßig zur Verfügung. Während
+der Klassenlader normalerweise von der virtuellen Maschine dazu verwendet
+wird, Klassendateien einzulesen, kann er von der Anwendung zum Einlesen
+beliebiger Dateien zweckentfremdet werden. Einzige Bedingung ist,
+dass die Ressourcen-Dateien in einem Verzeichnis stehen, das vom Klassenlader
+erreicht werden kann, das also innerhalb des Klassenpfades liegt.
+
+<p>
+Dazu kann beispielsweise im Basisverzeichnis der Anwendung ein Unterverzeichnis
+<font color="#660099">resources</font> angelegt und die Ressourcen-Dateien
+dort hineinkopiert werden. In unserem Fall würden wir also ein
+Unterverzeichnis <font color="#660099">com.gkrueger.resources</font>
+anlegen. Mit Hilfe der Methode <a name="ixa100836"><a href="index_g.html#ixb100640"><font color=#000080><tt>getResourceAsStream</tt></font></a></a>
+der Klasse <a name="ixa100837"><a href="index_c.html#ixb100641"><font color=#000080><tt>Class</tt></font></a></a>
+(siehe <a href="k100273.html#dieklasseclass">Abschnitt 43.2.2</a>)
+kann ein <a href="index_i.html#ixb100642"><font color=#000080><tt>InputStream</tt></font></a>
+beschafft werden, mit dem die Datei Byte für Byte eingelesen
+werden kann:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public InputStream getResourceAsStream(String name)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/Class.html" onClick="this.href=getApiDoc('java.lang.Class')"><font color="#660066" size=-1>java.lang.Class</font></a></td>
+</tr>
+</table>
+
+<p>
+Als Parameter wird der vollständige Name der Ressourcen-Datei
+angegeben, allerdings unter Beachtung einiger Besonderheiten. Zunächst
+werden die einzelnen Paketnamen nicht wie gewohnt durch Punkte, sondern
+durch Schrägstriche »/« voneinander getrennt (auch
+unter Windows wird dazu nicht der Backslash verwendet). Nur die Dateierweiterung
+wird wie üblich hinter einem Punkt angegeben. Zudem muss als
+erstes Zeichen ebenfalls ein Schrägstrich angegeben werden. Soll
+also beispielsweise die Datei <font color="#660099">hello.txt</font>
+aus dem Ressourcenverzeichnis geladen werden, so lautet der an <a href="index_g.html#ixb100640"><font color=#000080><tt>getResourceAsStream</tt></font></a>
+zu übergebende Dateiname <font color="#660099">/com/gkrueger/resources/hello.txt</font>.
+
+<p>
+Das folgende Listing zeigt eine einfache Methode, in der die angesprochenen
+Regeln implementiert werden. Sie beschafft zu einer beliebigen Datei,
+die sich in einem vorgegebenen Ressource-Verzeichnis befindet, das
+innerhalb des Klassenpfades liegt, einen <a href="index_i.html#ixb100642"><font color=#000080><tt>InputStream</tt></font></a>,
+mit dem die darin enthaltenen Daten eingelesen werden können:
+<a name="listingid013007"></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="#0000AA">private</font> InputStream getResourceStream(String pkgname, String fname)
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> String resname = <font color="#0000FF">"/"</font> + pkgname.replace(<font color="#0000FF">'.'</font>, <font color="#0000FF">'/'</font>) + <font color="#0000FF">"/"</font> + fname;
+<font color="#555555">004 </font> Class clazz = getClass();
+<font color="#555555">005 </font> InputStream is = clazz.getResourceAsStream(resname);
+<font color="#555555">006 </font> <font color="#0000AA">return</font> is;
+<font color="#555555">007 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 13.7: Einen InputStream zu einer Ressourcen-Datei beschaffen</i></p>
+
+<p>
+Als Argument wird der Paketname (in Punktnotation) und der Name der
+Ressourcen-Datei angegeben. Den obigen Regeln entsprechend werden
+beide in einen Ressourcen-Namen umgewandelt und an <a href="index_g.html#ixb100640"><font color=#000080><tt>getResourceAsStream</tt></font></a>
+übergeben. Diese liefert einen <a href="index_i.html#ixb100642"><font color=#000080><tt>InputStream</tt></font></a>,
+der zum Einlesen der Daten verwendet werden kann. Soll beispielsweise
+eine Text-Ressource in einen <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+geladen werden, kann dazu folgende Methode verwendet werden:
+<a name="listingid013008"></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">/* TestResource.inc */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.io.*;
+<font color="#555555">004 </font><font color="#0000AA">import</font> java.awt.*;
+<font color="#555555">005 </font>
+<font color="#555555">006 </font><font color="#00AA00">//...</font>
+<font color="#555555">007 </font>
+<font color="#555555">008 </font><font color="#0000AA">public</font> String loadTextResource(String pkgname, String fname)
+<font color="#555555">009 </font><font color="#0000AA">throws</font> IOException
+<font color="#555555">010 </font>{
+<font color="#555555">011 </font> String ret = <font color="#006699">null</font>;
+<font color="#555555">012 </font> InputStream is = getResourceStream(pkgname, fname);
+<font color="#555555">013 </font> <font color="#0000AA">if</font> (is != <font color="#006699">null</font>) {
+<font color="#555555">014 </font> StringBuffer sb = <font color="#0000AA">new</font> StringBuffer();
+<font color="#555555">015 </font> <font color="#0000AA">while</font> (<font color="#006699">true</font>) {
+<font color="#555555">016 </font> <font color="#006699">int</font> c = is.read();
+<font color="#555555">017 </font> <font color="#0000AA">if</font> (c == -1) {
+<font color="#555555">018 </font> <font color="#0000AA">break</font>;
+<font color="#555555">019 </font> }
+<font color="#555555">020 </font> sb.append((<font color="#006699">char</font>)c);
+<font color="#555555">021 </font> }
+<font color="#555555">022 </font> is.close();
+<font color="#555555">023 </font> ret = sb.toString();
+<font color="#555555">024 </font> }
+<font color="#555555">025 </font> <font color="#0000AA">return</font> ret;
+<font color="#555555">026 </font>}
+<font color="#555555">027 </font>
+<font color="#555555">028 </font><font color="#00AA00">//...</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/TestResource.inc"><font color="#000055" size=-1>TestResource.inc</font></a></td>
+</tr>
+</table>
+<i>
+Listing 13.8: Laden einer Text-Ressource</i></p>
+
+<p>
+Auch das Laden von <a href="index_i.html#ixb100643"><font color=#000080><tt>Image</tt></font></a>-Ressourcen
+(Programm-Icons, Abbildungen etc.) kann auf ähnliche Weise realisiert
+werden:
+<a name="listingid013009"></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">/* ImageResource.inc */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.io.*;
+<font color="#555555">004 </font><font color="#0000AA">import</font> java.awt.*;
+<font color="#555555">005 </font>
+<font color="#555555">006 </font><font color="#00AA00">//...</font>
+<font color="#555555">007 </font>
+<font color="#555555">008 </font><font color="#0000AA">public</font> Image loadImageResource(String pkgname, String fname)
+<font color="#555555">009 </font><font color="#0000AA">throws</font> IOException
+<font color="#555555">010 </font>{
+<font color="#555555">011 </font> Image ret = <font color="#006699">null</font>;
+<font color="#555555">012 </font> InputStream is = getResourceStream(pkgname, fname);
+<font color="#555555">013 </font> <font color="#0000AA">if</font> (is != <font color="#006699">null</font>) {
+<font color="#555555">014 </font> <font color="#006699">byte</font>[] buffer = <font color="#0000AA">new</font> <font color="#006699">byte</font>[0];
+<font color="#555555">015 </font> <font color="#006699">byte</font>[] tmpbuf = <font color="#0000AA">new</font> <font color="#006699">byte</font>[1024];
+<font color="#555555">016 </font> <font color="#0000AA">while</font> (<font color="#006699">true</font>) {
+<font color="#555555">017 </font> <font color="#006699">int</font> len = is.read(tmpbuf);
+<font color="#555555">018 </font> <font color="#0000AA">if</font> (len <= 0) {
+<font color="#555555">019 </font> <font color="#0000AA">break</font>;
+<font color="#555555">020 </font> }
+<font color="#555555">021 </font> <font color="#006699">byte</font>[] newbuf = <font color="#0000AA">new</font> <font color="#006699">byte</font>[buffer.length + len];
+<font color="#555555">022 </font> System.arraycopy(buffer, 0, newbuf, 0, buffer.length);
+<font color="#555555">023 </font> System.arraycopy(tmpbuf, 0, newbuf, buffer.length, len);
+<font color="#555555">024 </font> buffer = newbuf;
+<font color="#555555">025 </font> }
+<font color="#555555">026 </font> <font color="#00AA00">//create image</font>
+<font color="#555555">027 </font> ret = Toolkit.getDefaultToolkit().createImage(buffer);
+<font color="#555555">028 </font> is.close();
+<font color="#555555">029 </font> }
+<font color="#555555">030 </font> <font color="#0000AA">return</font> ret;
+<font color="#555555">031 </font>}
+<font color="#555555">032 </font>
+<font color="#555555">033 </font><font color="#00AA00">//...</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/ImageResource.inc"><font color="#000055" size=-1>ImageResource.inc</font></a></td>
+</tr>
+</table>
+<i>
+Listing 13.9: Laden einer Image-Ressource</i></p>
+
+<p>
+Voraussetzung ist natürlich, dass das Format der in den Puffer
+<font color="#000077"><tt>buffer</tt></font> eingelesenen Datei von
+der Methode <a name="ixa100838"><a href="index_c.html#ixb100644"><font color=#000080><tt>createImage</tt></font></a></a>
+verstanden wird. Beispiele für gültige Formate sind GIF
+oder JPEG.
+
+<p>
+Der große Vorteil bei dieser Vorgehensweise ist, dass sie sowohl
+mit separaten Klassendateien funktioniert, als auch, wenn die komplette
+Applikation inklusive der Ressourcen-Dateien innerhalb einer einzigen
+jar-Datei ausgeliefert wird. Für die Anwendung selbst ist es
+vollkommen gleichgültig, aus welcher Quelle die Dateien stammen.
+<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="k100083.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100086.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100088.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.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>
|
