SpringMVC学习笔记(四)--DAO层 --使用txt文件存储数据,正则表达式的运用

因为电脑上以前装过mysql又卸载了,这次本来想重装mysql的,结果因为之前的mysql卸不干净,弄了一下午也没法重装。干脆先从基础的做起吧,用txt文档来存数据。DAO层直接访问数据库,我的DAO层是直接访问txt文件,还省去了数据库连接件的麻烦,O(∩_∩)O哈哈~
我想要做一个问答系统,在一个文件中存储两条数据,一个question和一个answer,即问题和对应的答案,然后由DAO层取出数据。txt文件的格式如下:

QUESTION:
This is a question!
......
ANSWER:
This is the answer!
......

问题跟在全大写的"QUESTION:"后面,到"ANSWER:"之前截止,"ANSWER:"之后就是答案。我们只需要将文本读取到字符串中,使用正则表达式处理之后就能轻松取出数据啦~
下面是相关的QuestionDAO类的源码:

package DAO;

import org.springframework.stereotype.Component;

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class QuestionDAO {
    private File file;
    private String question;
    private String answer;

    //QuestionDAO在初始化时自动获取文件中的question和answer,并保存在属性中
    public QuestionDAO(){
        this.file = new File("F:\\QQPCmgr\\Desktop\\springMVC\\web\\Resources\\DailyChallenge\\question");
        StringBuilder result = new StringBuilder();//StringBuilder不是线程安全的,即StringBuilder不能被同步访问。
        // 但每个QuestionDAO实例都会重新new一个StrignBuilder,且使用单线程编程,因此这里可以使用StringBuilder类。
        try{
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);
            String s = null;
            while((s = br.readLine()) != null){
                result.append(s);
            }
            fr.close();
            br.close();//文件读取到了result中,释放缓冲区和FileReader
            s = result.toString();//使用s来保存结果,再用java正则表达式来取出s中的question和answer
            String pattern = "(QUESTION:)(.*)(ANSWER:)(.*)";
            Pattern r = Pattern.compile(pattern);//Pattern类没有公共构造方法,必须调用其公共静态编译方法来返回一个Pattern对象
            Matcher matcher = r.matcher(s);//Matcher类也没有公共构造方法,必须调用Pattern对象的matcher方法来返回一个Matcher对象
            if(matcher.find()){
                question = matcher.group(2);
                answer = matcher.group(4);
            }else{
                question = null;
                answer = null;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getQuestion() {
        return question;
    }

    public String getAnswer() {
        return answer;
    }

}

下面我来简单解释一下这段代码:
1、QuestionDAO类拥有三个属性:filequestionanswer。其中,file为存储数据的文件,question和answer就是存储在文件中的问题和答案。我希望在QuestionDAO的实例被创建时就自动获取file文件中的问题和答案,并存储在实例的question和answer属性中。这样,对应的Servlet就只需要创建一个QuestionDAO对象,然后通过get()方法就能获得数据了。
2、在QuestionDAO的构造方法中,首先初始化了file对象,并创建一个StringBuilder对象result来保存读取的结果。接下来创建了FileReaderBufferedReader对象,逐行将文件读取到result对象中。
3、因为result是一个StringBuilder对象,我们要将它转换为一个String对象才能使用正则表达式解析。通过StringBuilder类的toString()方法即可得到对应String对象。
4、最终的结果存储在了String对象s中,我们只需要对s进行匹配就可以得到question和answer啦!首先写好正则表达式:

String pattern = "(QUESTION:)(.*)(ANSWER:)(.*)";

可以看到,这个正则表达式有四个捕获组:(QUESTION:)、(.*)、(ANSWER:)、(.*)。如果匹配成功,则通过matcher.group(2)和matcher.group(4)就可以分别得到question和answer的内容了。
接着,创建Pattern对象和Matcher对象:

Pattern r = Pattern.compile(pattern);//Pattern类没有公共构造方法,必须调用其公共静态编译方法来返回一个Pattern对象
Matcher matcher = r.matcher(s);//Matcher类也没有公共构造方法,必须调用Pattern对象的matcher方法来返回一个Matcher对象

如果匹配成功,则将结果赋值给question和answer对象;失败则赋值为null:

if(matcher.find()){
                question = matcher.group(2);
                answer = matcher.group(4);
            }else{
                question = null;
                answer = null;
            }

OK,QuestionDAO类完成了它的使命,将文本中的问题和答案读取、解析并存储在了自己的question和answer属性中。这样,QuestionServlet就可以通过get()方法来得到question和answer数据了。
但是,txt文本还是很不方便用来存储数据的。
替代方案:
使用XML文件存储数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值