在上一章我們學習了怎樣使用Scanner類別的物件解析字串中的數據,那麼這一節我們將學習怎樣使用Scanner類別的物件解析檔案中的資料。
應用程式可能需要解析檔案中的特殊數據,此時,應用程式可以把檔案的內容全部讀入記憶體後,再解析所需的內容,其優點是處理速度快,但如果讀入的內容較大將消耗較多的內存,即以空間換取時間。
這一節主要介紹如何借助Scanner類別和正規表示式來解析文件,例如,要解析出文件中的特殊單字、數字等資訊。使用Scanner類別和正規表示式來解析檔案的特點是以時間換取空間,即解析的速度相對較慢,但節省記憶體。
建立Scanner對象,並指向要解析的文件,例如:
Filefile=newFile(hello.java);Scannersc=newScanner(file);
然後sc將空格作為分隔標記,呼叫next()方法依序返回file中的單詞,如果file最後一個單字已被next()方法傳回,sc呼叫hasNext()將傳回false,否則傳回true。
另外,對於數字型的單字,例如108,167.92等可以用nextInt()或nextDouble()方法來取代next()方法,即sc可以呼叫nextInt()或nextDouble()方法將數字型單字轉換為int或double資料傳回,但需要特別注意的是,如果單字不是數字型單詞,呼叫nextInt()或nextDouble()方法將發生InputMismatchException異常,在處理異常時可以呼叫next()方法傳回該非數位化單字。
建立Scanner對象,指向要解析的文件,並使用useDelimiter方法指定正規表示式作為分隔標記,例如:
Filefile=newFile(hello.java);Scannersc=newScanner(file);sc.useDelimiter(正規表示式);
那麼sc將正規表示式作為分隔標記,呼叫next()方法依序返回file中的單詞,如果file最後一個單字已被next()方法傳回,sc呼叫hasNext()將傳回false,否則傳回true。
另外,對於數字型的單字,例如1979,0.618等可以用nextInt()或nextDouble()方法來取代next()方法,即sc可以呼叫nextInt()或nextDouble()方法將數字型單字轉換為int或double資料傳回,但需要特別注意的是,如果單字不是數字型單詞,呼叫nextInt()或nextDouble()方法將發生InputMismatchException異常,那麼在處理異常時可以呼叫next()方法傳回該非數位化單字。
例如,使用正規表示式(匹配所有非數字字串)String regex=[^0123456789.]+作為分隔標記解析student.txt檔案中的學生成績,併計算平均成績。
student.txt
張三的成績是70分,李四的成績是80分,趙五的成績是90分。
程式碼如下:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(student.txt);Scannersc=null;intcount=0;doublesum=0;try{doublescore=0;sc=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(平均成績:+aver);}catch(Exceptionexp){System.out.println(exp);}}}