En el capítulo anterior aprendimos cómo usar objetos de la clase Scanner para analizar datos en cadenas, por lo que en esta sección aprenderemos cómo usar objetos de la clase Scanner para analizar datos en archivos.
Es posible que la aplicación necesite analizar datos especiales en el archivo. En este momento, la aplicación puede leer todo el contenido del archivo en la memoria y luego analizar el contenido requerido. La ventaja es que la velocidad de procesamiento es rápida, pero si la lectura. el contenido es grande, consumirá Más memoria significa intercambiar espacio por tiempo.
Esta sección presenta principalmente cómo usar la clase Scanner y expresiones regulares para analizar archivos, por ejemplo, para analizar palabras especiales, números y otra información en el archivo. La característica de utilizar la clase Scanner y expresiones regulares para analizar archivos es que el tiempo se intercambia por espacio, es decir, la velocidad de análisis es relativamente lenta, pero se ahorra memoria.
Cree un objeto Escáner y apunte al archivo que se va a analizar, por ejemplo:
Filefile=newFile(hola.java);Scannersc=newScanner(archivo);
Luego, sc usa espacios como delimitadores y llama al método next() para devolver las palabras del archivo en secuencia. Si la última palabra del archivo ha sido devuelta por el método next(), sc llama a hasNext() para devolver falso; de lo contrario, devuelve. verdadero.
Además, para palabras numéricas, como 108, 167,92, etc., puede utilizar el método nextInt() o nextDouble() en lugar del método next(), es decir, sc puede llamar a nextInt() o nextDouble(). Se devuelve el método para convertir las palabras numéricas en datos int o Double, pero es importante tener en cuenta que si la palabra no es una palabra numérica, se producirá una excepción InputMismatchException al llamar al método nextInt() o nextDouble() al manejar la excepción. , se puede llamar al método next() para devolver la palabra no numérica.
Cree un objeto Scanner, señale el archivo que se va a analizar y use el método useDelimiter para especificar la expresión regular como marca delimitadora, por ejemplo:
Filefile=newFile(hello.java);Scannersc=newScanner(archivo);sc.useDelimiter(expresión regular);
Luego, sc usa la expresión regular como delimitador y llama al método next() para devolver las palabras del archivo en secuencia. Si la última palabra del archivo ha sido devuelta por el método next(), sc llama a hasNext() y lo hace. devolverá falso; de lo contrario, devolverá verdadero.
Además, para palabras numéricas, como 1979, 0.618, etc., puede usar el método nextInt() o nextDouble() en lugar del método next(), es decir, sc puede llamar a nextInt() o nextDouble(). Se devuelve el método para convertir las palabras numéricas en datos int o Double, pero es importante tener en cuenta que si la palabra no es una palabra numérica, se producirá una excepción InputMismatchException al llamar al método nextInt() o nextDouble() y luego al manejar el método. excepción, puede llamar al método next() para devolver la palabra no numérica.
Por ejemplo, utilice la expresión regular (coincide con todas las cadenas no numéricas) String regex=[^0123456789.]+ como marca delimitada para analizar las calificaciones de los estudiantes en el archivo Student.txt y calcular la calificación promedio.
estudiante.txt
La puntuación de Zhang San es 70 puntos, la puntuación de Li Si es 80 puntos y la puntuación de Zhao Wu es 90 puntos.
El código es el siguiente:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(student.txt);Scannersc=null;intcount=0;doublesum=0;try{doublescore=0;sc= newScanner(archivo);sc.useDelimiter([^0123456789.]+); while(sc.hasNextDouble()){score=sc.nextDouble();count++;sum=sum+score;System.out.println(score) ;}doubleaver=sum/count;System.out.println(puntuación promedio:+aver);}catch(Exceptionexp){System.out.println(exp);}}}