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 Die Funktionsbibliothek
10 Threads und nebenläufige Programmierung
11 Raum und Zeit
12 Datenstrukturen und Algorithmen
13 Dateien und Datenströme
14 Die eXtensible Markup Language (XML)
15 Grafische Oberflächen mit Swing
16 Grafikprogrammierung
17 Netzwerkprogrammierung
18 Verteilte Programmierung mit RMI und Web-Services
19 JavaServer Pages und Servlets
20 Applets
21 Midlets und die Java ME
22 Datenbankmanagement mit JDBC
23 Reflection und Annotationen
24 Logging und Monitoring
25 Sicherheitskonzepte
26 Java Native Interface (JNI)
27 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Download: - ZIP, ca. 12,5 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> /Java-Insel | vor >>
Java ist auch eine Insel von Christian Ullenboom Programmieren mit der Java Standard Edition Version 6
Java ist auch eine Insel 7., aktualisierte Auflage geb., mit DVD (November 2007) 1.492 S., 49,90 Euro Galileo Computing ISBN 978-3-8362-1146-8 |
| 13 Dateien und Datenströme
|  | 13.1 Datei und Verzeichnis
|  |  | 13.1.1 Dateien und Verzeichnisse mit der Klasse File
|  |  | 13.1.2 Verzeichnis oder Datei? Existiert es?
|  |  | 13.1.3 Verzeichnis- und Dateieigenschaften/-attribute
|  |  | 13.1.4 Wurzelverzeichnis, Laufwerksnamen, Plattenspeicher
|  |  | 13.1.5 Umbenennen und Verzeichnisse anlegen
|  |  | 13.1.6 Verzeichnisse listen und Dateien filtern
|  |  | 13.1.7 Dateien berühren, neue Dateien anlegen, temporäre Dateien
|  |  | 13.1.8 Dateien und Verzeichnisse löschen
|  |  | 13.1.9 Verzeichnisse nach Dateien iterativ durchsuchen
|  |  | 13.1.10 URL- und URI-Objekte aus einem File-Objekt ableiten
|  |  | 13.1.11 Mit Locking Dateien sperren
|  |  | 13.1.12 Sicherheitsprüfung
|  |  | 13.1.13 Mime-Typen mit dem JavaBeans Activation Framework (JAF)
|  |  | 13.1.14 Zugriff auf SMB-Server mit jCIFS
|  | 13.2 Dateien mit wahlfreiem Zugriff
|  |  | 13.2.1 Ein RandomAccessFile zum Lesen und Schreiben öffnen
|  |  | 13.2.2 Aus dem RandomAccessFile lesen
|  |  | 13.2.3 Schreiben mit RandomAccessFile
|  |  | 13.2.4 Die Länge des RandomAccessFile
|  |  | 13.2.5 Hin und her in der Datei
|  |  | 13.2.6 Wahlfreier Zugriff und Pufferung mit Unified I/O
|  | 13.3 Stream-Klassen und Reader/Writer am Beispiel von Dateien
|  |  | 13.3.1 Mit dem FileWriter Texte in Dateien schreiben
|  |  | 13.3.2 Zeichen mit der Klasse FileReader lesen
|  |  | 13.3.3 Kopieren mit FileOutputStream und FileInputStream
|  |  | 13.3.4 Das FileDescriptor-Objekt
|  | 13.4 Basisklassen für die Ein-/Ausgabe
|  |  | 13.4.1 Die abstrakten Basisklassen
|  |  | 13.4.2 Übersicht über Ein-/Ausgabeklassen
|  |  | 13.4.3 Die abstrakte Basisklasse OutputStream
|  |  | 13.4.4 Die Schnittstellen Closeable und Flushable
|  |  | 13.4.5 Ein Datenschlucker
|  |  | 13.4.6 Die abstrakte Basisklasse InputStream
|  |  | 13.4.7 Ressourcen wie Grafiken aus dem Klassenpfad und aus Jar–Archiven laden
|  |  | 13.4.8 Ströme mit SequenceInputStream zusammensetzen
|  |  | 13.4.9 Die abstrakte Basisklasse Writer
|  |  | 13.4.10 Die Schnittstelle Appendable
|  |  | 13.4.11 Die abstrakte Basisklasse Reader
|  | 13.5 Formatierte Textausgaben
|  |  | 13.5.1 Die Klassen PrintWriter und PrintStream
|  |  | 13.5.2 System.out, System.err und System.in
|  |  | 13.5.3 Geschützte Passwort-Eingaben mit der Klasse Console
|  | 13.6 Schreiben und Lesen aus Strings und Byte-Feldern
|  |  | 13.6.1 Mit dem StringWriter ein String-Objekt füllen
|  |  | 13.6.2 CharArrayWriter
|  |  | 13.6.3 StringReader und CharArrayReader
|  |  | 13.6.4 Mit ByteArrayOutputStream in ein Byte-Feld schreiben
|  |  | 13.6.5 Mit ByteArrayInputStream aus einem Byte-Feld lesen
|  | 13.7 Datenströme filtern und verketten
|  |  | 13.7.1 Streams als Filter verketten
|  |  | 13.7.2 Gepufferte Ausgaben mit BufferedWriter und BufferedOutputStream
|  |  | 13.7.3 Gepufferte Eingaben mit BufferedReader und BufferedInputStream
|  |  | 13.7.4 LineNumberReader zählt automatisch Zeilen mit
|  |  | 13.7.5 Daten mit der Klasse PushbackReader zurücklegen
|  |  | 13.7.6 DataOutputStream/DataInputStream
|  |  | 13.7.7 Basisklassen für Filter
|  |  | 13.7.8 Die Basisklasse FilterWriter
|  |  | 13.7.9 Ein LowerCaseWriter
|  |  | 13.7.10 Eingaben mit der Klasse FilterReader filtern
|  | 13.8 Vermittler zwischen Byte-Streams und Unicode-Strömen
|  |  | 13.8.1 Datenkonvertierung durch den OutputStreamWriter
|  |  | 13.8.2 Automatische Konvertierungen mit dem InputStreamReader
|  | 13.9 Kommunikation zwischen Threads mit Pipes
|  |  | 13.9.1 PipedOutputStream und PipedInputStream
|  |  | 13.9.2 PipedWriter und PipedReader
|  | 13.10 Datenkompression
|  |  | 13.10.1 Java-Unterstützung beim Komprimieren und Zusammenpacken
|  |  | 13.10.2 Datenströme komprimieren
|  |  | 13.10.3 Zip-Archive
|  |  | 13.10.4 Jar-Archive
|  | 13.11 Prüfsummen
|  |  | 13.11.1 Die Schnittstelle Checksum
|  |  | 13.11.2 Die Klasse CRC32
|  |  | 13.11.3 Die Adler32-Klasse
|  | 13.12 Persistente Objekte und Serialisierung
|  |  | 13.12.1 Objekte mit der Standard-Serialisierung speichern und lesen
|  |  | 13.12.2 Zwei einfache Anwendungen der Serialisierung
|  |  | 13.12.3 Die Schnittstelle Serializable
|  |  | 13.12.4 Nicht serialisierbare Attribute aussparen
|  |  | 13.12.5 Das Abspeichern selbst in die Hand nehmen
|  |  | 13.12.6 Tiefe Objektkopien
|  |  | 13.12.7 Versionenverwaltung und die SUID
|  |  | 13.12.8 Wie die ArrayList serialisiert
|  |  | 13.12.9 Probleme mit der Serialisierung
|  |  | 13.12.10 Serialisieren in XML-Dateien
|  |  | 13.12.11 JavaBeans Persistence
|  |  | 13.12.12 XStream
|  | 13.13 Tokenizer
|  |  | 13.13.1 StreamTokenizer
|  |  | 13.13.2 CSV-(Comma Separated Values-)Dateien verarbeiten
|  | 13.14 Zum Weiterlesen
## 13.13 Tokenizer 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. ### 13.13.1 StreamTokenizer 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, Hochkomma- 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 13.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, ., – 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 dies 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()-Funktion 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 Funktion nextToken() zu überschreiben und vielleicht auch noch toString(). Die Erweiterung von nextToken() erfordert jedoch etwas Arbeit, da das Original ein wenig unübersichtlich ist. ### 13.13.2 CSV-(Comma Separated Values-)Dateien verarbeiten Eine CSV-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( 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.
Name |
E-Mail |
Ihr Kommentar |
<< zurück | <top> | vor >>

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