Im vorherigen Kapitel haben wir gelernt, wie man Objekte der Scanner-Klasse verwendet, um Daten in Zeichenfolgen zu analysieren. In diesem Abschnitt erfahren wir, wie man Objekte der Scanner-Klasse verwendet, um Daten in Dateien zu analysieren.
Die Anwendung muss möglicherweise spezielle Daten in der Datei analysieren. Zu diesem Zeitpunkt kann die Anwendung den gesamten Inhalt der Datei in den Speicher lesen und dann den erforderlichen Inhalt analysieren Wenn der Inhalt groß ist, verbraucht er mehr Speicher, was bedeutet, dass Platz gegen Zeit eingetauscht wird.
In diesem Abschnitt wird hauptsächlich die Verwendung der Scanner-Klasse und regulärer Ausdrücke zum Parsen von Dateien vorgestellt, beispielsweise zum Parsen spezieller Wörter, Zahlen und anderer Informationen in der Datei. Das Merkmal der Verwendung der Scanner-Klasse und regulärer Ausdrücke zum Parsen von Dateien besteht darin, dass Zeit gegen Speicherplatz ausgetauscht wird, dh die Parsing-Geschwindigkeit ist relativ langsam, aber Speicher wird gespart.
Erstellen Sie ein Scanner-Objekt und verweisen Sie auf die zu analysierende Datei, zum Beispiel:
Filefile=newFile(hello.java);Scannersc=newScanner(file);
Dann verwendet sc Leerzeichen als Trennzeichen und ruft die Methode next() auf, um die Wörter in der Datei der Reihe nach zurückzugeben. Wenn das letzte Wort der Datei von der Methode next() zurückgegeben wurde, ruft sc hasNext() auf, um false zurückzugeben, andernfalls wird zurückgegeben WAHR.
Darüber hinaus können Sie für numerische Wörter wie 108, 167,92 usw. die Methode nextInt() oder nextDouble() anstelle der Methode next() verwenden, d. h. sc kann nextInt() oder nextDouble() aufrufen Methode zum Konvertieren der numerischen Wörter in int- oder Double-Daten wird zurückgegeben. Es ist jedoch wichtig zu beachten, dass beim Aufrufen der nextInt()- oder nextDouble()-Methode bei der Behandlung der Ausnahme eine InputMismatchException auftritt , kann die Methode next() aufgerufen werden, um das nicht numerische Wort zurückzugeben.
Erstellen Sie ein Scanner-Objekt, zeigen Sie auf die zu analysierende Datei und verwenden Sie die Methode useDelimiter, um den regulären Ausdruck als Trennzeichen anzugeben, zum Beispiel:
Filefile=newFile(hello.java);Scannersc=newScanner(file);sc.useDelimiter(regular expression);
Dann verwendet sc den regulären Ausdruck als Trennzeichen und ruft die Methode next() auf, um die Wörter in der Datei der Reihe nach zurückzugeben. Wenn das letzte Wort der Datei von der Methode next() zurückgegeben wurde, ruft sc hasNext() auf wird „false“ zurückgeben, andernfalls wird „true“ zurückgegeben.
Darüber hinaus können Sie für numerische Wörter wie 1979, 0,618 usw. die Methode nextInt() oder nextDouble() anstelle der Methode next() verwenden, d. h. sc kann nextInt() oder nextDouble() aufrufen Methode zum Konvertieren der numerischen Wörter in int- oder Double-Daten wird zurückgegeben. Es ist jedoch wichtig zu beachten, dass beim Aufrufen der nextInt()- oder nextDouble()-Methode eine InputMismatchException auftritt Ausnahme: Sie können die Methode next() aufrufen, um das nicht numerische Wort zurückzugeben.
Verwenden Sie beispielsweise den regulären Ausdruck (entspricht allen nicht numerischen Zeichenfolgen) String regex=[^0123456789.]+ als Trennzeichen, um die Schülernoten in der Datei student.txt zu analysieren und die Durchschnittsnote zu berechnen.
student.txt
Die Punktzahl von Zhang San beträgt 70 Punkte, die Punktzahl von Li Si 80 Punkte und die Punktzahl von Zhao Wu 90 Punkte.
Der Code lautet wie folgt:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(student.txt);Scannersc=null;intcount=0;doublesum=0;try{doublescore=0;sc= newScanner(file);sc.useDelimiter([^0123456789.]+);while(sc.hasNextDouble()){score=sc.nextDouble();count++;sum=sum+score;System.out.println(score) ;}doubleaver=sum/count;System.out.println(durchschnittliche Punktzahl:+aver);}catch(Exceptionexp){System.out.println(exp);}}}