在上一章我们学习了怎样使用Scanner类的对象解析字符串中的数据,那么这一节我们将学习怎样使用Scanner类的对象解析文件中的数据。


应用程序可能需要解析文件中的特殊数据,此时,应用程序可以把文件的内容全部读入内存后,再解析所需要的内容,其优点是处理速度快,但如果读入的内容较大将消耗较多的内存,即以空间换取时间。


这一节主要介绍怎样借助Scanner类正则表达式来解析文件,比如,要解析出文件中的特殊单词、数字等信息。使用Scanner类和正则表达式来解析文件的特点是以时间换取空间,即解析的速度相对较慢,但节省内存。


1.使用默认分隔标记解析文件

创建Scanner对象,并指向要解析的文件,例如:

File file = new File("hello.java");
Scanner sc = new Scanner(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()方法返回该非数字化单词。


2.使用正则表达式作为分隔标记解析文件

创建Scanner对象,指向要解析的文件,并使用useDelimiter方法指定正则表达式作为分隔标记,例如:

File file = new File("hello.java");
Scanner sc = new Scanner(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分。


代码如下:

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String args[]) {
        File file = new File("student.txt");
        Scanner sc = null;
        int count = 0;
        double sum = 0;
        try {
            double score = 0;
            sc = new Scanner(file);
            sc.useDelimiter("[^0123456789.]+");
            while(sc.hasNextDouble()) {
                score = sc.nextDouble();
                count++;
                sum = sum+score;
                System.out.println(score);
            }
            double aver = sum/count;
            System.out.println("平均成绩:"+aver);
        }
        catch(Exception exp) {
            System.out.println(exp);
        }
    }
}


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)