1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
<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,k100120.html;106,k100120.html;107,k100122.html;108,k100125.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="k100120.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100120.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100122.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100125.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 18 - Character-Streams
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id018001"></a>
<h2>18.1 Allgemeine Konzepte </h2>
<hr>
<ul>
<li><a href="k100121.html#sectlevel2id018001">18.1 Allgemeine Konzepte</a>
</ul>
<hr>
<p>
Als Sprache, die nicht nur das Erstellen vorwiegend grafikorientierter
Web-Applets ermöglicht, sondern auch zur Entwicklung von eigenständigen
Anwendungen eingesetzt werden soll, bietet Java eine umfangreiche
Bibliothek zum sequenziellen und wahlfreien Zugriff auf Dateien und
zur Verwaltung von Verzeichnissen. Während der wahlfreie Zugriff
ähnlich wie in anderen Sprachen gelöst ist, wurden bei der
sequenziellen Ein-/Ausgabe neue Wege beschritten. Die dafür verwendeten
Klassen realisieren das aus anderen Sprachen bekannte Konzept der
<i>Streams</i> auf der Basis objektorientierter Techniken.
<p>
Ein <a name="ixa101235"><i>Stream</i></a> wird dabei zunächst
als abstraktes Konstrukt eingeführt, dessen Fähigkeit darin
besteht, Zeichen auf ein imaginäres Ausgabegerät zu schreiben
oder von diesem zu lesen. Erst konkrete Unterklassen binden die Zugriffsroutinen
an echte Ein- oder Ausgabegeräte, wie beispielsweise an Dateien,
Strings oder Kommunikationskanäle im Netzwerk.
<p>
Das Stream-Klassenkonzept von Java bietet die Möglichkeit, Streams
zu verketten oder zu schachteln. Die Verkettung von Streams ermöglicht
es, mehrere Dateien zusammenzufassen und für den Aufrufer als
einen einzigen Stream darzustellen. Das Schachteln von Streams erlaubt
die Konstruktion von Filtern, die bei der Ein- oder Ausgabe bestimmte
Zusatzfunktionen übernehmen, beispielsweise das Puffern von Zeichen,
das Zählen von Zeilen oder die Interpretation binärer Daten.
Beide Konzepte sind mit normalen Sprachmitteln realisiert und können
selbst erweitert werden. Es ist ohne weiteres möglich, eigene
Filter zu schreiben, die den Ein- oder Ausgabestrom analysieren und
anwendungsbezogene Funktionalitäten realisieren.
<p>
Alle Klassen zur Dateiein- und -ausgabe befinden sich im Paket <a name="ixa101236"><a href="index_j.html#ixb100189"><font color=#000080><tt>java.io</tt></font></a></a>.
Um sie zu verwenden, sollte daher folgende Anweisung an den Anfang
eines Programms gestellt werden:
<font color="#000077">
<pre>
import java.io.*;
</pre>
</font>
<p>
Bis zur Version 1.0 des JDK gab es nur <a name="ixa101237"><i>Byte-Streams</i></a>
in Java. Wesentliches Merkmal eines Byte-Streams war es dabei, dass
jede einzelne Transporteinheit 8 Bit lang war (also ein einzelnes
Byte). Während damit die Kompatibilität zu Textdateien,
die mit konventionellen Programmiersprachen erstellt wurden oder von
diesen gelesen werden sollten, gewährleistet war, gab es naturgemäß
Probleme bei der Umwandlung in die 16 Bit langen Unicode-Zeichen,
die innerhalb von Java zur Zeichendarstellung benutzt werden. Zudem
war die Abbildung zwischen Bytes und Characters eher unsystematisch
gelöst und bot wenig Unterstützung für die Anpassung
an unterschiedliche Zeichensätze und nationale Gegebenheiten.
<p>
All dies hat die JDK-Designer dazu bewogen, das Konzept der Streams
in der Version 1.1 zu überdenken und die neue Gruppe der <a name="ixa101238"><i>Character-Streams</i></a>
einzuführen. Character-Streams verwenden grundsätzlich 16
Bit lange Unicode-Zeichen und arbeiten daher besser mit den String-
und Zeichentypen von Java zusammen. Um zu den 8-Bit-Zeichensätzen
in externen Dateien kompatibel zu bleiben, wurden explizite Brückenklassen
eingeführt, die Character-Streams in Byte-Streams überführen
und umgekehrt. Diese bieten nun auch die Möglichkeit der Anpassung
an spezielle Zeichensätze und lokale Besonderheiten.
<p>
Wir werden uns in diesem Kapitel ausschließlich mit den Character-Streams
beschäftigen, weil sie für die Verarbeitung von textbasierten
Streams wichtig sind. Byte-Streams und Brückenklassen werden
im nächsten Kapitel erläutert. Wir werden dort sehen, dass
es - selbst im UNICODE-Zeitalter - eine ganze Reihe von Anwendungen
für byteorientierte Dateizugriffe gibt.
<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 Beispiele in diesem Kapitel wurden hauptsächlich unter Windows
entwickelt und getestet, und mitunter kommen darin windows-spezifische
Besonderheiten vor. So wird als Zeilenendezeichen »\r\n«
verwendet, obwohl unter UNIX »\n« und auf dem Mac »\r«
gebräuchlich ist. Am besten ist es natürlich, das System-Property
<a name="ixa101239"><a href="index_l.html#ixb100833"><font color=#000080><tt>line.separator</tt></font></a></a>
zu verwenden (siehe <a href="k100110.html#systemproperties">Abschnitt 16.3.1</a>).
Auch bei den Pfadseparatoren gibt es Unterschiede. Während unter
Windows der Backslash »\« verwendet wird, ist es unter UNIX
der Slash »/«. Mit dem System-Property <a name="ixa101240"><a href="index_f.html#ixb100831"><font color=#000080><tt>file.separator</tt></font></a></a>
kann auch auf diese Eigenschaft portabel zugegriffen werden.</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>
<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="k100120.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100120.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100122.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100125.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>
|