Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Generics, innere Klassen
10 Die Klassenbibliothek
11 Threads und nebenläufige Programmierung
12 Datenstrukturen und Algorithmen
13 Raum und Zeit
14 Dateien und Datenströme
15 Die eXtensible Markup Language (XML)
16 Grafische Oberflächen mit Swing
17 Grafikprogrammierung
18 Netzwerkprogrammierung
19 Verteilte Programmierung mit RMI und Web–Services
20 JavaServer Pages und Servlets
21 Applets
22 Midlets und die Java ME
23 Datenbankmanagement mit JDBC
24 Reflection und Annotationen
25 Logging und Monitoring
26 Sicherheitskonzepte
27 Java Native Interface (JNI)
28 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- ZIP, ca. 14,1 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel (8. Auflage) von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel (8. Auflage)

Java ist auch eine Insel (8. Aufl.)
8., aktual. Auflage, geb., mit DVD
1.475 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1371-4
Pfeil 14 Dateien und Datenströme
Pfeil 14.1 Datei und Verzeichnis
Pfeil 14.1.1 Dateien und Verzeichnisse mit der Klasse File
Pfeil 14.1.2 Verzeichnis oder Datei? Existiert es?
Pfeil 14.1.3 Verzeichnis- und Dateieigenschaften/-attribute
Pfeil 14.1.4 Wurzelverzeichnis, Laufwerksnamen, Plattenspeicher
Pfeil 14.1.5 Umbenennen und Verzeichnisse anlegen
Pfeil 14.1.6 Verzeichnisse listen und Dateien filtern
Pfeil 14.1.7 Dateien berühren, neue Dateien anlegen, temporäre Dateien
Pfeil 14.1.8 Dateien und Verzeichnisse löschen
Pfeil 14.1.9 Verzeichnisse nach Dateien iterativ durchsuchen
Pfeil 14.1.10 URL- und URI-Objekte aus einem File-Objekt ableiten
Pfeil 14.1.11 Mit Locking Dateien sperren
Pfeil 14.1.12 Sicherheitsprüfung
Pfeil 14.2 Dateien mit wahlfreiem Zugriff
Pfeil 14.2.1 Ein RandomAccessFile zum Lesen und Schreiben öffnen
Pfeil 14.2.2 Aus dem RandomAccessFile lesen
Pfeil 14.2.3 Schreiben mit RandomAccessFile
Pfeil 14.2.4 Die Länge des RandomAccessFile
Pfeil 14.2.5 Hin und her in der Datei
Pfeil 14.3 Stream-Klassen und Reader/Writer am Beispiel von Dateien
Pfeil 14.3.1 Mit dem FileWriter Texte in Dateien schreiben
Pfeil 14.3.2 Zeichen mit der Klasse FileReader lesen
Pfeil 14.3.3 Kopieren mit FileOutputStream und FileInputStream
Pfeil 14.3.4 Das FileDescriptor-Objekt
Pfeil 14.4 Basisklassen für die Ein-/Ausgabe
Pfeil 14.4.1 Die abstrakten Basisklassen
Pfeil 14.4.2 Übersicht über Ein-/Ausgabeklassen
Pfeil 14.4.3 Die abstrakte Basisklasse OutputStream
Pfeil 14.4.4 Die Schnittstellen Closeable und Flushable
Pfeil 14.4.5 Ein Datenschlucker
Pfeil 14.4.6 Die abstrakte Basisklasse InputStream
Pfeil 14.4.7 Ressourcen aus dem Klassenpfad und aus Jar–Archiven laden
Pfeil 14.4.8 Ströme mit SequenceInputStream zusammensetzen
Pfeil 14.4.9 Die abstrakte Basisklasse Writer
Pfeil 14.4.10 Die Schnittstelle Appendable
Pfeil 14.4.11 Die abstrakte Basisklasse Reader
Pfeil 14.5 Formatierte Textausgaben
Pfeil 14.5.1 Die Klassen PrintWriter und PrintStream
Pfeil 14.5.2 System.out, System.err und System.in
Pfeil 14.5.3 Geschützte Passwort-Eingaben mit der Klasse Console
Pfeil 14.6 Schreiben und Lesen aus Strings und Byte-Feldern
Pfeil 14.6.1 Mit dem StringWriter ein String-Objekt füllen
Pfeil 14.6.2 CharArrayWriter
Pfeil 14.6.3 StringReader und CharArrayReader
Pfeil 14.6.4 Mit ByteArrayOutputStream in ein Byte-Feld schreiben
Pfeil 14.6.5 Mit ByteArrayInputStream aus einem Byte-Feld lesen
Pfeil 14.7 Datenströme filtern und verketten
Pfeil 14.7.1 Streams als Filter verketten
Pfeil 14.7.2 Gepufferte Ausgaben mit BufferedWriter/BufferedOutputStream
Pfeil 14.7.3 Gepufferte Eingaben mit BufferedReader/BufferedInputStream
Pfeil 14.7.4 LineNumberReader zählt automatisch Zeilen mit
Pfeil 14.7.5 Daten mit der Klasse PushbackReader zurücklegen
Pfeil 14.7.6 DataOutputStream/DataInputStream
Pfeil 14.7.7 Basisklassen für Filter
Pfeil 14.7.8 Die Basisklasse FilterWriter
Pfeil 14.7.9 Ein LowerCaseWriter
Pfeil 14.7.10 Eingaben mit der Klasse FilterReader filtern
Pfeil 14.8 Vermittler zwischen Byte-Streams und Unicode-Strömen
Pfeil 14.8.1 Datenkonvertierung durch den OutputStreamWriter
Pfeil 14.8.2 Automatische Konvertierungen mit dem InputStreamReader
Pfeil 14.9 Kommunikation zwischen Threads mit Pipes
Pfeil 14.9.1 PipedOutputStream und PipedInputStream
Pfeil 14.9.2 PipedWriter und PipedReader
Pfeil 14.10 Datenkompression
Pfeil 14.10.1 Java-Unterstützung beim Komprimieren
Pfeil 14.10.2 Datenströme komprimieren
Pfeil 14.10.3 Zip-Archive
Pfeil 14.10.4 Jar-Archive
Pfeil 14.11 Prüfsummen
Pfeil 14.11.1 Die Schnittstelle Checksum
Pfeil 14.11.2 Die Klasse CRC32
Pfeil 14.11.3 Die Adler32-Klasse
Pfeil 14.12 Persistente Objekte und Serialisierung
Pfeil 14.12.1 Objekte mit der Standard-Serialisierung speichern und lesen
Pfeil 14.12.2 Zwei einfache Anwendungen der Serialisierung
Pfeil 14.12.3 Die Schnittstelle Serializable
Pfeil 14.12.4 Nicht serialisierbare Attribute aussparen
Pfeil 14.12.5 Das Abspeichern selbst in die Hand nehmen
Pfeil 14.12.6 Tiefe Objektkopien
Pfeil 14.12.7 Versionenverwaltung und die SUID
Pfeil 14.12.8 Wie die ArrayList serialisiert
Pfeil 14.12.9 Probleme mit der Serialisierung
Pfeil 14.12.10 Serialisieren in XML-Dateien
Pfeil 14.12.11 JavaBeans Persistence
Pfeil 14.12.12 XStream
Pfeil 14.13 Tokenizer
Pfeil 14.13.1 StreamTokenizer
Pfeil 14.13.2 CSV-Dateien verarbeiten
Pfeil 14.14 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

14.13 Tokenizer Zur nächsten ÜberschriftZur vorigen Ü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. Außerdem soll eine externe Klasse vorgestellt werden, die mit CSV-Dateien umgehen kann.


Galileo Computing - Zum Seitenanfang

14.13.1 StreamTokenizer Zur 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 Sun 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 14.50 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. [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 das nächste 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 das Token TT_EOF zurückgegeben wird.
  • void pushBack()
    Legt das aktuelle 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.


Galileo Computing - Zum Seitenanfang

14.13.2 CSV-Dateien verarbeiten topZur vorigen Überschrift

Eine CSV-(Comma-separated-Values-)Datei bildet die Zeilen und Spalten einer Tabelle in einer ASCII-Datei ab. Die Zellen sind dabei durch ein Komma oder ein anderes Trennzeichen separiert. Texte können in Anführungszeichen gesetzt werden, um etwa Leerzeichen zu berücksichtigen.

Rodney,King,"Fahrer" 
Bryant,Allen,"Gast auf dem Rücksitz"

Auch MS Excel kann Tabellen in das CSV-Format exportieren, nutzt aber in der deutschen Version als Trenner ein Semikolon – CSV wird bei MS also zu einer sprachabhängigen Datei (außer der Export wird über ein englischsprachiges Makro angestoßen, da ist es wieder ein Komma). In der ersten Zeile stehen die Tabellenköpfe.

Sollten CSV-Dateien in Java verarbeitet werden, fällt spontan die Klasse StringTokenizer auf, die zum Einlesen jedoch nicht besonders gut geeignet ist. Welches Trennsymbol sollte gewählt werden? Sicherlich das Semikolon. Doch was, wenn dieses im Text vorkommt? Dann wird der Text in zwei Tokens aufgeteilt – was falsch ist. Des Weiteren kann der Java StringTokenizer nicht mit Leerstrings umgehen, also auf Zeilenfolgen wie ;; im Datenstrom reagieren; er würde sie überlesen, aber nicht einen leeren String zurückgeben.

StringTokenizer hilft hier nicht weiter, wohl aber eine quelloffene Bibliothek von Stephen Ostermiller unter http://ostermiller.org/utils/CSV.html. Mit dem CSVParser lassen sich leicht CSV-Dateien einlesen, und er behandelt auch Fluchtsymbole korrekt.

CSVParser csvParser = new CSVParser( new FileInputStream("datei.csv") ); 
for ( String t; (t = csvParser.nextValue()) != null; ) 
  System.out.println( csvParser.lastLineNumber() + " " + t );


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 ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


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

 Tipp
Zum Katalog: Coding for Fun





 Coding for Fun


 Buchempfehlungen
Zum Katalog: Objektorientierte Programmierung





 Objektorientierte
 Programmierung


Zum Katalog: Einstieg in Eclipse 3.4






 Einstieg in
 Eclipse 3.4


Zum Katalog: Java 6 lernen mit Eclipse






 Java 6 lernen
 mit Eclipse


Zum Katalog: NetBeans Platform 6






 NetBeans
 Platform 6


Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Visual C# 2008






 Visual C# 2008


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
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.


[Galileo Computing]

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