StreamTokenizer
-
Hi,
habe ein paar Fragen zu einem Beispielcode.import java.io.*; public class WordCount2 { public static int words = 0; public static int lines = 0; public static int chars = 0; public static void wc(Reader r) throws IOException{ StreamTokenizer tok = new StreamTokenizer(r); tok.resetSyntax(); tok.wordChars(33, 255); tok.whitespaceChars(0, ' '); tok.eolIsSignificant(true); while(tok.nextToken() != tok.TT_EOF){ //TT_EOF Ende des Eingabestroms switch(tok.ttype) //Gibt den Typ des gerade gelesenen Zeichen/token an { case StreamTokenizer.TT_EOL: //Zeilenende lines++; chars++; break; case StreamTokenizer.TT_WORD: words++; default: chars += tok.sval.length(); //sval enthät den Wert erkannter Wörter break; } } } public static void main(String[] args) throws IOException{ if(args.length == 0){ //Das Programm arbeitet mit stdin wc(new InputStreamReader(System.in)); System.out.println(lines + " " +words + " " + chars); } else{ //Das Programm arbeitet mit einer Dateiliste int twords = 0, tchars = 0, tlines = 0; for(int i = 0; i<args.length; i++){ words = chars = lines = 0; wc(new FileReader(args)); twords += words; tchars += chars; tlines += lines; System.out.print(args[i] + ": " + lines + " " + words + " " + chars); System.out.println(); } System.out.println("Gesamt: " + tlines + " "+ twords + " " + tchars); } } }
Wenn ich tok.resetSyntax(); lösche, dann ändert sich gar nicht an der Ausgabe. Wozu soll das gut sein?
Mein Buch sagt folgendes:Mit der Methode [i]resetSyntax()
- wird die Menge der Standardtrennzeichen zurückgesetzt. Diese Zeichen sind für eine Feinunterteilung von Java-Programmen vorgesehen und daher für dieses Beispiel zu speziell
Also bei meiner File sind auch Zeichen wie : - ) dabei...
Dann bei tok.wordChars(33, 255); Wieso fängt er bei 33 an? Wenn ich 0 als Startwert eingebe, kommt dasselbe raus.
void wordChars(int Start, int Ende)
Mit Start und Ende wird der Bereich gültiger Zeichen angegeben. In diesem Beispiel sind das die Zeichen des Bereichs 33 bis 255
Dann noch das hier:
void whitespaceChars(int Start, int Ende))
Der Bereich nicht sichtbarer Zeichen wird mit Start und Ende eingegrentzt.
Warum schreibt er denn tok.whitespaceChars(0, ' '); Wieso schreibt er ein Leerzeichen? Das wird doch in den ASCII-Code umgewandelt. Was bringt das?
Liebe Grüße
Real
-
Real schrieb:
Dann noch das hier:
void whitespaceChars(int Start, int Ende))
Der Bereich nicht sichtbarer Zeichen wird mit Start und Ende eingegrentzt.
Warum schreibt er denn tok.whitespaceChars(0, ' '); Wieso schreibt er ein Leerzeichen? Das wird doch in den ASCII-Code umgewandelt. Was bringt das?
Yo, das Leerzeichen ist ASCII 32 (s. http://n.ethz.ch/student/stammt/doc/Allgemeines/Ascii.html).
Alle Zeichen von 0 bis 32 werden also ignoriert (als Whitespace behandelt).Real schrieb:
Wenn ich tok.resetSyntax(); lösche, dann ändert sich gar nicht an der Ausgabe. Wozu soll das gut sein?
Mein Buch sagt folgendes:Mit der Methode resetSyntax() wird die Menge der Standardtrennzeichen zurückgesetzt. Diese Zeichen sind für eine Feinunterteilung von Java-Programmen vorgesehen und daher für dieses Beispiel zu speziell
Also bei meiner File sind auch Zeichen wie : - ) dabei...
Scheinbar könntest Du also auch die Standardeinstellung so belassen.
Alle nicht alphanumerischen Zeichen werden wohl als Whitespace angesehen.[quote="Real"]Dann bei tok.wordChars(33, 255); Wieso fängt er bei 33 an? Wenn ich 0 als Startwert eingebe, kommt dasselbe raus.
void wordChars(int Start, int Ende)
Mit Start und Ende wird der Bereich gültiger Zeichen angegeben. In diesem Beispiel sind das die Zeichen des Bereichs 33 bis 255
Siehe oben. Alles ab 33 (bis 32 war's noch inklusive Leerzeichen) wird genommen. Bis 32 sind üblicherweise nur (nicht-darstellbare) Steuerzeichen vorhanden (CR und LF z.B.).
Warum das trotzdem geht, weiß ich auch nicht. Wahrscheinlich aber ignoriert er das Zeichen sowieso, wenn es schon in den Whitespace-Zeichen (s.o.) vorkommt...
-
Ok, danke soweit mal. Aber warum kommt eine NullPointerException, wenn ich die Methode whitespaceChars rauslösche?
Liebe Grüße
Real