Java案例分析
【实验7-3】 日记本
2024-10-25 28 0
简介 1.任务描述 编写一个日记本功能的程序,使用字节流经日记的具体信息记录在本地的txt文件中。当用户输入日记的特定内容后,会将输入的内容保存至本地的txt文件中。需要输入的内容包括“姓名”,“天气”、“标题”、“内容”的数据。保存的时候需要判断本地是否存在文件,如果存在则追加,不存在则新建。文件命名格式为“黑马日记本”加上“.txt”后缀,如“黑马日记本.txt”
【实验7-3】 日记本
【任务介绍】
1.任务描述
编写一个日记本功能的程序,使用字节流经日记的具体信息记录在本地的txt文件中。当用户输入日记的特定内容后,会将输入的内容保存至本地的txt文件中。需要输入的内容包括“姓名”,“天气”、“标题”、“内容”的数据。保存的时候需要判断本地是否存在文件,如果存在则追加,不存在则新建。文件命名格式为“黑马日记本”加上“.txt”后缀,如“黑马日记本.txt”
2.运行结果
任务运行结果如图7-1所示。
图7-2 运行结果
运行结束后在本地生成一个“黑马日记本.txt”文件,
【任务目标】
l 学会分析"日记本小功能"程序的实现思路。
l 根据思路独立完成"日记本小功能"的源代码编写、编译及运行。
l 掌握字节流操作本地文件的方法。
l 掌握ArrayList和StringBuffer的使用,以及异常的处理。
【实现思路】
(1)为方便保存日记的相关信息,可以将日记信息封装成一个实体类。
(2)用户编写日记时,首先创建一个集合用于存放日记,然后用户依次填写的内容为“姓名”,“天气”、“标题”和“内容”,并将这些内容存放在集合中,再将实体类保存到txt文件中。
(3)查询日记时,使用字节流的读取实现控制台打印日记信息。
(4)将日记信息写入到txt文件之前,需先拼凑好txt文件名,再判断本地是否已存在此文件,这里可通过输入流尝试获取此文件的字节流,如果获取成功,则证明这个文件已存在,那么就通过输出流向文件末尾追加日记信息,如果获取失败,即异常,说明之前并没有生成日记信息,则需要新建此文件。
【实现代码】
日记小功能的实现代码,如文件7-1所示。
(1)将日记信息封装成一个实体类Diary,具体如文件7-1所示。
文件7-1 Diary.java
1 package chapter0703;
2 public class Diary {
3 String time; //时间
4 String name; //姓名
5 String weather;//天气
6 String title;//标题
7 String content;//内容
8 public Diary(String time, String name, String weather, String title,
9 String content) {
10 this.time = time;
11 this.name = name;
12 this.weather = weather;
13 this.title = title;
14 this.content=content;
15 }
16 }
在文件7-1中,第3-7行代码定义了用于标识日记信息的各个字段,第8-14行代码重新了toString()方法。
(2)定义DiaryOrder类来记录和操作日记信息,具体如文件7-2所示。
文件7-2 DiaryOrder.java
1 package chapter0703;
2 import java.text.DateFormat;
3 import java.text.SimpleDateFormat;
4 import java.util.ArrayList;
5 import java.util.Date;
6 import java.util.Scanner;
7 public class DiaryOrder {
8 static ArrayList<Diary> diarysList=new ArrayList<Diary>();
9 public static void main(String[] args) throws Exception {
10 System.out.println("--------欢迎来到黑马日记本--------");
11 boolean falg = true;
12 Scanner scan=new Scanner(System.in);
13 while(falg) {
14 System.out.println("1.编写日记");
15 System.out.println("2.查看日记");
16 int a = scan.nextInt();
17 if(a==1) {
18 //编写日记
19 System.out.println("请输入姓名:");
20 String name=scan.next();
21 System.out.println("请输入天气:");
22 String weather=scan.next();
23 System.out.println("请输入标题:");
24 String title=scan.next();
25 System.out.println("请输入内容:");
26 String content=scan.next();
27 Diary diary = addDiary(name,weather,title,content);
28 FileUtil.saveBooks(diary);
29 }else if(a==2) {
30 //查看日记
31 FileUtil.readFile();
32 }else {
33 System.out.println("输入错误");
34 }
35 }
36 }
37 /*
38 * 初始化日记列表 将输入的字符暂存为实体
39 */
40 private static Diary addDiary(String name,String weather,String
41 title,String content) {
42 Date date = new Date();
43 DateFormat format = new SimpleDateFormat("yyyyMMdd");
44 String a=format.format(date).toString();
45 Diary diary=new Diary(a,name,weather,title,content);
46 return diary;
47 }
48 }
在文件7-2中,第8行代码创建了ArrayList类型的全局变量作为存储日记的仓库。第13~35行代码使用while循环输入操作,第19~26行代码让用户输入日记,第27~28行代码将用户输入的日记存入本地文件,第31行代码调用readFile()方法显示日记,第40~47行代码初始化日记信息。
(3)定义工具类FileUtil保存日记信息,具体如文件7-3所示。
文件7-3 FileUtil.java
1 package chapter0703;
2 import java.io.BufferedOutputStream;
3 import java.io.FileInputStream;
4 import java.io.FileNotFoundException;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.text.DateFormat;
9 import java.text.SimpleDateFormat;
10 import java.util.Date;
11 /**
12 * 工具类
13 */
14 public class FileUtil {
15 public static final String SEPARATE_FIELD = "\n";// 换行
16 public static final String SEPARATE_LINE = "\t"; // 分隔
17 /**
18 * 保存日记信息
19 */
20 public static void saveBooks(Diary diary) {
21 // 判断本地是否存在此文件
22 String name = "黑马日记本.txt";
23 File file = new File("name");
24 if (!file.exists()) {
25 createFile(name, false, diary);
26 } else {
27 createFile(name, true, diary);
28 }
29 }
30 /**
31 * 将日记信息保存到本地,可通过label标识来判断是修改文件还是新建文件
32 * @param name 文件名
33 * @param label 文件已存在的标识 true:已存在则修改; false:不存在则新建
34 * @param diary 日记信息
35 */
36 public static void createFile(String name, boolean label, Diary diary) {
37 BufferedOutputStream out = null;
38 StringBuffer sbf = new StringBuffer();// 拼接内容
39 try {
40 if (label) {// 当已存在当天的文件,则在文件内容后追加
41 // 创建输出流,用于追加文件
42 out = new BufferedOutputStream(new FileOutputStream(name, true));
43 } else {// 不存在当天文件,则新建文件
44 // 创建输出流,用于保存文件
45 out = new BufferedOutputStream(new FileOutputStream(name));
46 String fieldSort = "欢迎来到黑马日记本" ;// 创建表头
47 // 新建时,将表头存入本地文件
48 sbf.append(fieldSort).append(SEPARATE_FIELD);
49 }
50 sbf.append("时间:").append(diary.time);// 追加换行符号
51 sbf.append("姓名:").append(diary.name).append(SEPARATE_LINE);
52 sbf.append("标题:").append(diary.title).append(SEPARATE_LINE);
53 sbf.append("天气:").append(diary.weather).append(SEPARATE_FIELD);
54 sbf.append("内容:").append(diary.content).append(SEPARATE_FIELD);
55 String str = sbf.toString();
56 byte[] b = str.getBytes();
57 for (int i = 0; i < b.length; i++) {
58 out.write(b[i]);// 将内容写入本地文件
59 }
60 } catch (Exception e) {
61 e.printStackTrace();
62 } finally {
63 try {
64 if (out != null)
65 out.close();// 关闭输出流
66 } catch (Exception e2) {
67 e2.printStackTrace();
68 }
69 }
70 }
71 /*
72 * 读取日记并显示
73 */
74 public static void readFile() throws Exception{
75 //创建文件字节输出流
76 FileInputStream in = new FileInputStream("黑马日记本.txt");
77 byte[] b = new byte[in.available()];
78 in.read(b);
79 String str=new String(b);
80 System.out.println(str);
81 in.close();
82 }
83 }
在文件7-3中,当saveBooks()方法被调用时,获取当前日期并格式化后,拼出了文件名,再通过第24~29行代码判断文件是否存在,如果存在,则修改文件,如果不存在,则创建一个新文件。
第36~70行代码定义了createFile()方法,createFile()方法中的label参数如果为true则追加内容,如果label值是false则新建文件。第50~55行代码行代码拼出一行数据,且在每次拼接之前都要加上换行符“\r\n”,每个字段之间通过“,”分隔字段;第56~59行代码将内容写入文件。第63~69行代码关闭了输出流。