前の章では、Scanner クラスのオブジェクトを使用して文字列内のデータを解析する方法を学習しました。このセクションでは、Scanner クラスのオブジェクトを使用してファイル内のデータを解析する方法を学習します。
アプリケーションは、ファイル内の特殊なデータを解析する必要がある場合があります。このとき、アプリケーションはファイルのすべての内容をメモリに読み込んでから、必要な内容を解析できるという利点がありますが、読み取った場合には処理速度が速くなります。コンテンツが大きいと消費します。メモリが増えると、スペースと時間を交換することになります。
このセクションでは主に、 Scanner クラスと正規表現を使用してファイルを解析する方法 (たとえば、ファイル内の特殊な単語、数字、その他の情報を解析する) を紹介します。 Scanner クラスと正規表現を使用してファイルを解析する特徴は、時間が空間と交換されることです。つまり、解析速度は比較的遅くなりますが、メモリは節約されます。
Scanner オブジェクトを作成し、解析するファイルを指定します。次に例を示します。
Filefile=newFile(hello.java);Scannersc=newScanner(file);
次に、sc はスペースを区切り文字として使用し、next() メソッドを呼び出してファイル内の単語を順番に返します。ファイルの最後の単語が next() メソッドによって返された場合、sc は hasNext() を呼び出して false を返します。真実。
さらに、108、167.92 などの数値単語の場合、 next() メソッドの代わりに nextInt() または nextDouble() メソッドを使用できます。つまり、 sc は nextInt() または nextDouble() を呼び出すことができます。数値単語を int または Double データに変換するメソッドが返されますが、単語が数値単語でない場合、例外を処理する際に nextInt() または nextDouble() メソッドを呼び出すときに、InputMismatchException が発生することに注意することが重要です。 、 next() メソッドを呼び出して、数値以外の単語を返すことができます。
Scanner オブジェクトを作成し、解析するファイルをポイントし、useDelimiter メソッドを使用して区切り記号として正規表現を指定します。次に例を示します。
Filefile=newFile(hello.java);Scannersc=newScanner(ファイル);sc.useDelimiter(正規表現);
次に、sc は正規表現を区切り文字として使用し、next() メソッドを呼び出してファイル内の単語を順番に返します。ファイルの最後の単語が next() メソッドによって返された場合、sc は hasNext() を呼び出します。場合は false を返し、それ以外の場合は true を返します。
さらに、1979、0.618 などの数値単語の場合、 next() メソッドの代わりに nextInt() または nextDouble() メソッドを使用できます。つまり、 sc は nextInt() または nextDouble() を呼び出すことができます。数値単語を int または Double データに変換するメソッドが返されますが、単語が数値単語でない場合、 nextInt() または nextDouble() メソッドを呼び出すときに、InputMismatchException が発生することに注意することが重要です。例外として、 next() メソッドを呼び出して数値以外の単語を返すことができます。
たとえば、正規表現 (数値以外のすべての文字列に一致する) String regex=[^0123456789.]+ を区切り記号として使用して、student.txt ファイル内の生徒の成績を解析し、平均成績を計算します。
学生.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= newScanner(file);sc.useDelimiter([^0123456789.]+);while(sc.hasNextDouble()){score=sc.nextDouble();count++;sum=sum+score;System.out.println(スコア) ;}doubleaver=sum/count;System.out.println(平均スコア:+aver);}catch(Exceptionexp){System.out.println(exp);}}}