因为电脑上以前装过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类拥有三个属性:file、question、answer。其中,file为存储数据的文件,question和answer就是存储在文件中的问题和答案。我希望在QuestionDAO的实例被创建时就自动获取file文件中的问题和答案,并存储在实例的question和answer属性中。这样,对应的Servlet就只需要创建一个QuestionDAO对象,然后通过get()方法就能获得数据了。
2、在QuestionDAO的构造方法中,首先初始化了file对象,并创建一个StringBuilder对象result来保存读取的结果。接下来创建了FileReader和BufferedReader对象,逐行将文件读取到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文件存储数据