Galileo Computing :: Java 7 - Mehr als eine Insel - 6 Datenströme
Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Neues in Java 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- openbook, ca. 21,3 MB
Buch bestellen
Ihre Meinung?

Spacer
Java 7 - Mehr als eine Insel von Christian Ullenboom
Das Handbuch zu den Java SE-Bibliotheken
Buch: Java 7 - Mehr als eine Insel

Java 7 - Mehr als eine Insel
Galileo Computing
1433 S., 2012, geb.
49,90 Euro, ISBN 978-3-8362-1507-7
Pfeil 6 Datenströme
Pfeil 6.1 Stream-Klassen und Reader/Writer am Beispiel von Dateien
Pfeil 6.1.1 Mit dem FileWriter Texte in Dateien schreiben
Pfeil 6.1.2 Zeichen mit der Klasse FileReader lesen
Pfeil 6.1.3 Kopieren mit FileOutputStream und FileInputStream
Pfeil 6.1.4 Das FileDescriptor-Objekt *
Pfeil 6.1.5 Datenströme über Files mit NIO.2 beziehen
Pfeil 6.2 Basisklassen für die Ein-/Ausgabe
Pfeil 6.2.1 Die abstrakten Basisklassen
Pfeil 6.2.2 Übersicht über Ein-/Ausgabeklassen
Pfeil 6.2.3 Die abstrakte Basisklasse OutputStream
Pfeil 6.2.4 Die Schnittstellen Closeable, AutoCloseable und Flushable
Pfeil 6.2.5 Ein Datenschlucker *
Pfeil 6.2.6 Die abstrakte Basisklasse InputStream
Pfeil 6.2.7 Ressourcen aus dem Klassenpfad und aus Jar?Archiven laden
Pfeil 6.2.8 Ströme mit SequenceInputStream zusammensetzen *
Pfeil 6.2.9 Die abstrakte Basisklasse Writer
Pfeil 6.2.10 Die Schnittstelle Appendable *
Pfeil 6.2.11 Die abstrakte Basisklasse Reader
Pfeil 6.3 Formatierte Textausgaben
Pfeil 6.3.1 Die Klassen PrintWriter und PrintStream
Pfeil 6.3.2 System.out, System.err und System.in
Pfeil 6.4 Schreiben und Lesen aus Strings und Byte-Feldern
Pfeil 6.4.1 Mit dem StringWriter ein String-Objekt füllen
Pfeil 6.4.2 CharArrayWriter
Pfeil 6.4.3 StringReader und CharArrayReader
Pfeil 6.4.4 Mit ByteArrayOutputStream in ein Byte-Feld schreiben
Pfeil 6.4.5 Mit ByteArrayInputStream aus einem Byte-Feld lesen
Pfeil 6.5 Datenströme filtern und verketten
Pfeil 6.5.1 Streams als Filter verketten (verschachteln)
Pfeil 6.5.2 Gepufferte Ausgaben mit BufferedWriter und BufferedOutputStream
Pfeil 6.5.3 Gepufferte Eingaben mit BufferedReader/BufferedInputStream
Pfeil 6.5.4 LineNumberReader zählt automatisch Zeilen mit *
Pfeil 6.5.5 Daten mit der Klasse PushbackReader zurücklegen *
Pfeil 6.5.6 DataOutputStream/DataInputStream *
Pfeil 6.5.7 Basisklassen für Filter *
Pfeil 6.5.8 Die Basisklasse FilterWriter *
Pfeil 6.5.9 Ein LowerCaseWriter *
Pfeil 6.5.10 Eingaben mit der Klasse FilterReader filtern *
Pfeil 6.5.11 Anwendungen für FilterReader und FilterWriter *
Pfeil 6.6 Vermittler zwischen Byte-Streams und Unicode-Strömen
Pfeil 6.6.1 Datenkonvertierung durch den OutputStreamWriter
Pfeil 6.6.2 Automatische Konvertierungen mit dem InputStreamReader
Pfeil 6.7 Kommunikation zwischen Threads mit Pipes *
Pfeil 6.7.1 PipedOutputStream und PipedInputStream
Pfeil 6.7.2 PipedWriter und PipedReader
Pfeil 6.8 Prüfsummen
Pfeil 6.8.1 Die Schnittstelle Checksum
Pfeil 6.8.2 Die Klasse CRC32
Pfeil 6.8.3 Die Adler32-Klasse
Pfeil 6.9 Persistente Objekte und Serialisierung
Pfeil 6.9.1 Objekte mit der Standard-Serialisierung speichern und lesen
Pfeil 6.9.2 Zwei einfache Anwendungen der Serialisierung *
Pfeil 6.9.3 Die Schnittstelle Serializable
Pfeil 6.9.4 Nicht serialisierbare Attribute aussparen
Pfeil 6.9.5 Das Abspeichern selbst in die Hand nehmen
Pfeil 6.9.6 Tiefe Objektkopien *
Pfeil 6.9.7 Versionenverwaltung und die SUID
Pfeil 6.9.8 Wie die ArrayList serialisiert *
Pfeil 6.9.9 Probleme mit der Serialisierung
Pfeil 6.10 Alternative Datenaustauschformate
Pfeil 6.10.1 Serialisieren in XML-Dateien
Pfeil 6.10.2 XML-Serialisierung von JavaBeans mit JavaBeans Persistence *
Pfeil 6.10.3 Die Open-Source-Bibliothek XStream *
Pfeil 6.10.4 Binäre Serialisierung mit Google Protocol Buffers *
Pfeil 6.11 Tokenizer *
Pfeil 6.11.1 StreamTokenizer
Pfeil 6.12 Zum Weiterlesen

Galileo Computing - Zum Seitenanfang

6.11 Tokenizer *Zur nächsten Überschrift

Zu den schon im String-Kapitel vorgestellten Tokenizern Scanner, StringTokenizer und split() aus String gibt es im java.io-Paket eine weitere Klasse: StreamTokenizer.


Galileo Computing - Zum Seitenanfang

6.11.1 StreamTokenizerZur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse StreamTokenizer arbeitet noch spezialisierter als die StringTokenizer-Klasse aus dem util-Paket, und die Klasse Scanner kommt der Klasse StreamTokenizer schon sehr nahe. Im Gegensatz zum Scanner beachtet ein StreamTokenizer keine Unicode-Eingabe, sondern nur Zeichen aus dem Bereich von \u0000 bis \u00FF, kann aber mit Kommentaren umgehen.

Während des Parsens erkennt der Tokenizer bestimmte Merkmale, so unter anderem Bezeichner (etwa Schlüsselwörter), Zahlen, Strings in Anführungszeichen und verschiedene Kommentararten (C-Stil oder C++-Stil). Verschiedene Java-Tools von Oracle verwenden intern einen StreamTokenizer, um ihre Eingabedateien zu verarbeiten, etwa das Policy-Tool für die Rechteverwaltung. Der Erkennungsvorgang wird anhand einer Syntaxtabelle überprüft. Diese Tabelle enthält zum Beispiel die Zeichen, die ein Schlüsselwort identifizieren, oder die Zeichen, die Trennzeichen sind. Jedes gelesene Zeichen wird dann keinem, einem oder mehreren Attributen zugeordnet. Diese Attribute fallen in die Kategorie Trennzeichen, alphanumerische Zeichen, Zahlen, Hochkommata beziehungsweise Anführungszeichen oder Kommentarzeichen.

Zur Benutzung der Klasse wird zunächst ein StreamTokenizer-Objekt erzeugt, und dann werden die Syntaxtabellen initialisiert. Ob Kommentarzeilen überlesen werden sollen, wird durch

st.slashSlashComments( true );       // Kommentar
st.slashStarComments( true ); /* Kommentar */

gesteuert. Die erste Methode überliest im Eingabestrom alle Zeichen bis zum Return. Die zweite Methode überliest nur alles bis zum Stern/Slash. Geschachtelte Kommentare sind hier nicht möglich.

Beim Lesen des Datenstroms mit nextToken() kann über bestimmte Flags erfragt werden, ob im Stream ein Wort beziehungsweise Bezeichner (TT_WORD), eine Zahl (TT_NUMBER), das Ende der Datei (TT_EOF) oder das Ende der Zeile (TT_EOL) vorliegt. Wichtig ist, eolIsSignificant(true) zu setzen, da andernfalls der StreamTokenizer nie ein TT_EOL findet. Wurde ein Wort erkannt, dann werden alle Zeichen in Kleinbuchstaben konvertiert. Dies lässt sich über die Methode lowerCaseMode(boolean) einstellen. Nach der Initialisierung eines StreamTokenizer-Objekts wird normalerweise so lange nextToken() aufgerufen, bis die Eingabe keine neuen Zeichen mehr hergibt, also ein TT_EOF-Token erkannt wurde.

Ein Beispiel: Die folgende Klasse liest die Eingabe vom Netzwerk und gibt die erkannten Textteile aus:

Listing 6.38: com/tutego/insel/io/stream/StreamTokenizerDemo.java, main()

URL url = new URL( "http://www.tutego.com/index.html" );
Reader reader = new InputStreamReader( url.openStream() );
StreamTokenizer st = new StreamTokenizer( reader );

// st.slashSlashComments( true ); */
st.slashStarComments( true );
st.ordinaryChar( '/' );
st.parseNumbers();
st.eolIsSignificant( true );

for ( int tval; (tval = st.nextToken()) != StreamTokenizer.TT_EOF; )
{
if ( tval == StreamTokenizer.TT_NUMBER )
System.out.println( "Nummer: " + st.nval );
else if ( tval == StreamTokenizer.TT_WORD )
System.out.println( "Wort: " + st.sval );
else if ( tval == StreamTokenizer.TT_EOL )
System.out.println( "Ende der Zeile" );
else
System.out.println( "Zeichen: " + (char) st.ttype );
}
class java.io.StreamTokenizer
  • StreamTokenizer(Reader r)
    Erzeugt einen Tokenizer, der den Datenstrom zerlegt. Der Konstruktor, der das Ganze auch mit einem InputStream macht, ist veraltet.
  • void resetSyntax()
    Reinitialisiert die Syntaxtabelle des Tokenizers, sodass kein Zeichen eine Sonderbehandlung genießt. Mit ordinaryChar() lässt sich das Verhalten eines Zeichens bestimmen.
  • void wordChars(int low, int hi)
    Zeichen im Bereich von low <= c <= hi werden als Bestandteile von Wörtern erkannt, dementsprechend zusammengefasst und als Word-Token übergeben.[50](Dass der Endwert – wie sonst bei den Intervallangaben üblich – inklusive und nicht exklusive ist, stellt einen Stilbruch dar.)
  • void whitespaceChars(int low, int hi)
    Zeichen im Bereich von low <= c <= hi werden als Trennzeichen erkannt.
  • void ordinaryChars(int low, int hi)
    Zeichen im Bereich von low <= c <= hi genießen keine Sonderbehandlung und werden als normale Zeichen einzeln behandelt.
  • void ordinaryChar(int ch)
    Das Zeichen besitzt keine zusätzliche Funktion, ist zum Beispiel kein Kommentarzeichen, Trennsymbol oder Nummernzeichen. Spezialform für ordinaryChars(ch, ch).
  • void parseNumbers()
    Zahlen (Zahl-Literale) sollen vom Tokenizer erkannt werden. In der Syntaxtabelle gelten die zwölf Zeichen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, . und – als numerisch. Liegt eine Ganz- oder Fließkommazahl vor, wird der Zahlenwert in nval abgelegt, und das Token ergibt im Attribut ttype den Wert TT_NUMBER.
  • void commentChar(int ch)
    Gibt das Zeichen an, das einen einzeiligen Kommentar einleitet. Alle nachfolgenden Zeichen werden dann bis zum Zeilenende ignoriert. So ließen sich beispielsweise FORTRAN-Kommentare nach commentChar('C') überlesen.
  • void slashStarComments(boolean flag)
    Der Tokenizer soll Kommentare im C-Stil (/* Müll */) erkennen oder nicht.
  • void slashSlashComments(boolean flag)
    Der Tokenizer soll Kommentare im C++-Stil (// Zeile ) erkennen oder nicht.
  • void lowerCaseMode(boolean fl)
    Liegt in ttype ein Token vom Typ TT_WORD vor, wird es automatisch in Kleinschreibweise konvertiert, falls fl gleich true ist.
  • int nextToken() throws IOException
    Liefert den nächsten Token im Datenstrom. Der Typ des Tokens wird im Attribut ttype hinterlegt. Zusätzliche Informationen befinden sich im Attribut nval (Nummer) oder sval (Zeichenkette). In der Regel wird so lange geparst, bis der Token TT_EOF zurückgegeben wird.
  • void pushBack()
    Legt den aktuellen Token in den Eingabestrom zurück. Ein Aufruf von nextToken() liefert erneut den aktuellen Wert im Attribut ttype und ändert nval oder sval nicht.
  • int lineno()
    Liefert die aktuelle Zeilennummer in der Eingabedatei.

Erweiterungen und Schwächen

Obwohl die nextToken()-Methode eine ganze Reihe von Konvertierungen durchführt, erkennt sie keine in der Exponentialdarstellung geschriebenen Zahlen. Bei einer Gleitkommazahl wie –31.415E-1 versagt die Konvertierung und liefert nur –31.415 als Token vom Typ TT_NUMBER. Da StreamTokenizer nicht final ist, kann jedoch jeder die Klasse so erweitern, dass sie zum Beispiel TT_FLOAT_NUMBER bei einer Gleitkommazahl liefert. Dazu ist die öffentliche Methode nextToken() zu überschreiben und vielleicht auch noch toString(). Die Erweiterung von nextToken() erfordert jedoch etwas Arbeit, da das Original ein wenig unübersichtlich ist.



Ihr Kommentar

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







<< zurück
  Zum Katalog
Zum Katalog: Java 7 – Mehr als eine Insel
Java 7 – Mehr als eine Insel
Jetzt bestellen


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

 Buchempfehlungen
Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Einstieg in Eclipse 3.7






 Einstieg in
 Eclipse 3.7


Zum Katalog: Android 3






 Android 3


Zum Katalog: NetBeans Platform 7






 NetBeans Platform 7


Zum Katalog: Java ist auch eine Insel






 Java ist
 auch eine Insel


Zum Katalog: Apps entwickeln für Android 4






 Apps entwickeln
 für Android 4


Zum Katalog: Java 7






 Java 7


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




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


[Galileo Computing]

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