이전 장에서 Scanner 클래스의 객체를 사용하여 문자열의 데이터를 구문 분석하는 방법을 배웠으므로 이번 섹션에서는 Scanner 클래스의 객체를 사용하여 파일의 데이터를 구문 분석하는 방법을 알아봅니다.
이때 애플리케이션은 파일의 모든 내용을 메모리로 읽어온 후 필요한 내용을 구문 분석할 수 있다는 장점이 있지만, 읽은 경우에는 처리 속도가 빠릅니다. 콘텐츠가 크면 소비됩니다. 메모리가 많다는 것은 공간을 시간과 교환한다는 의미입니다.
이 섹션에서는 Scanner 클래스 와 정규식을 사용하여 파일을 구문 분석하는 방법(예: 파일에 있는 특수 단어, 숫자 및 기타 정보를 구문 분석하는 방법)을 주로 소개합니다. Scanner 클래스와 정규식을 사용하여 파일을 구문 분석하는 특징은 시간이 공간으로 교환된다는 것입니다. 즉, 구문 분석 속도는 상대적으로 느리지만 메모리가 절약됩니다.
Scanner 객체를 생성하고 구문 분석할 파일을 가리킵니다. 예:
Filefile=newFile(hello.java);Scannersc=newScanner(파일);
그런 다음 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
Zhang San의 점수는 70점, Li Si의 점수는 80점, Zhao Wu의 점수는 90점입니다.
코드는 다음과 같습니다:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(student.txt);Scannersc=null;intcount=0;doublesum=0;try{doublescore=0;sc= newScanner(파일);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);}}}