知乎脚丫第四弹

《知乎脚丫第三弹》已经能把所需要的问题标题、问题的描述、问题的链接、评论者姓名以及评论(貌似评论爬去地还不太准确)打印在控制台上,这一辑运用Java的io库把所有的内容优雅地输出到本地文件中。

本地创建文件、写文件

既然要本地存储,那么首先本地得有地方放东西,这个地方就是文件。在本项目里先创建文件夹out,在创建outout.txt文件用来存储内容。
这里使用BufferedWriter缓冲区,通过BufferedWriter和FileWriter的链接,BufferedWriter可以暂存一堆数据,然后到满的时候再实际写入磁盘,这样就可以减少对磁盘操作的次数。这其实也是装饰设计模式的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
   /*
* 参数:filename="output.txt";
* 实际上文件的绝对路径是:out/output.txt
*/

public static void writeIntoFile(String filename){
//先要创建一个文件夹
File dir=new File("out");
dir.mkdirs();
//再创建文件
File file=new File("out/"+filename);
try{
file.createNewFile();
}catch(Exception e){
e.printStackTrace();
}
System.out.println("create \"out/output.txt file\" successed.");

//往刚创建的文件里面写数据
try {
BufferedWriter outwriter=new BufferedWriter(new FileWriter(file));
outwriter.write("大家好,这是我的博客地址:henryliyunfeng.github.io\n我就是爱折腾的李昀峰");
outwriter.flush();
outwriter.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

enter description here

为Zhihu类添加格式化排版方法realToString()

1
2
3
4
5
6
7
8
9
10
11
12
13
//格式化内容,用于Filewiter.java写入本地时的排版
public String realToString(){
String content= "问题标题:"+question+"\r\n";
content+="问题的描述:"+questionDescription+"\r\n";
content+="链接:"+zhihuUrl+"\r\n";
content+="评论者:"+answersName+"\r\n";
content+="回答:";
for(int i=0;i<answers.size();i++){
int num=i+1;
content+="No."+num+"="+answers.get(i)+"\r\n";
}
return content;
}

enter description here
可以看出,输出内容了有很多<img>、<b>、<br>、<a>等html标签,是不需要的内容,可以把这些东西替换掉,自然想到String类里面有replaceAll(src,target)方法,则改进后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//格式化内容,用于Filewiter.java写入本地时的排版
public String realToString(){
String content= "问题标题:"+question+"\r\n";
content+="问题的描述:"+questionDescription+"\r\n";
content+="链接:"+zhihuUrl+"\r\n";
content+="评论者:"+answersName+"\r\n";
content+="回答:";
for(int i=0;i<answers.size();i++){
int num=i+1;
content+="No."+num+"="+answers.get(i)+"\r\n";
}
//去除替换部分不需要的html标签
content = content.replaceAll("<br>", "\r\n");
content = content.replaceAll("<.*?>", "");
return content;
}

多态,重写writeIntoFile(filename,myZhihu)方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
* 参数:filename="output.txt";
* ArrayList<Zhihu> myZhihu即将写入的内容
* 实际上文件的绝对路径是:out/output.txt
*/

public static void writeIntoFile(String filename,ArrayList<Zhihu> myZhihu ){
//先要创建一个文件夹
File dir=new File("out");
dir.mkdirs();
//再创建文件
boolean isSuccess=false;
File file=new File("out/"+filename);//只是把字符串名字换成抽象的名字
try{
isSuccess=file.createNewFile();//这才是实际的创建文件
}catch(Exception e){
e.printStackTrace();
}
if(isSuccess){
System.out.println("create \"out/output.txt file\" successed.");
}
else
System.out.println("create file failed!Already had,we override it");

//将myZhihu数组中的元素,依次写入filename文件里面。
try {
BufferedWriter outWriter=new BufferedWriter(new FileWriter(file));
for(Zhihu item : myZhihu){
outWriter.write(item.realToString());
}
outWriter.flush();//刷新缓冲区,立即写入
outWriter.close();//写完之后要一定关闭文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

enter description here
明显的可以看到那些烦人的html标签不复存在了,OK,打完收工!

热评文章