日记本-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-3】  日记本

【任务介绍】

  1.任务描述

编写一个日记本功能的程序,使用字节流经日记的具体信息记录在本地的txt文件中。当用户输入日记的特定内容后,会将输入的内容保存至本地的txt文件中。需要输入的内容包括“姓名”,“天气”、“标题”、“内容”的数据。保存的时候需要判断本地是否存在文件,如果存在则追加,不存在则新建。文件命名格式为“黑马日记本”加上“.txt”后缀,如“黑马日记本.txt”

  2.运行结果

任务运行结果如图7-1所示。

图7-2 运行结果

运行结束后在本地生成一个“黑马日记本.txt”文件,如图7-2所示。

图7-2 黑马日记本.txt

 

【实现思路】

(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行代码关闭了输出流。

  • 17
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,以下是程序的代码: ```python import os # 判断文件是否存在,存在则打开文件,不存在则新建文件 def create_diary_file(): if os.path.exists("黑马日记本.txt"): file = open("黑马日记本.txt", "a+", encoding="utf-8") else: file = open("黑马日记本.txt", "w", encoding="utf-8") file.write("姓名\t天气\t标题\t内容\n") # 写入表头 return file # 读取文件内容 def read_diary_file(): file = open("黑马日记本.txt", "r", encoding="utf-8") content = file.read() file.close() return content # 将日记信息写入文件 def write_diary_file(name, weather, title, content): file = create_diary_file() file.write(f"{name}\t{weather}\t{title}\t{content}\n") file.close() # 用户输入日记信息 def input_diary_info(): name = input("请输入您的姓名:") weather = input("请输入今天的天气:") title = input("请输入日记标题:") content = input("请输入日记内容:") write_diary_file(name, weather, title, content) print("日记保存成功!") # 主程序 def main(): content = read_diary_file() print(content) input_diary_info() if __name__ == '__main__': main() ``` 程序使用了三个函数: - `create_diary_file()` 判断文件是否存在,如果存在则打开文件,如果不存在则新建文件,并在文件写入表头。 - `read_diary_file()` 读取文件的内容。 - `write_diary_file(name, weather, title, content)` 将用户输入的日记信息写入文件,每个字段之间用制表符分隔。 在 `main()` 函数,先读取文件的内容并打印出来,然后调用 `input_diary_info()` 函数让用户输入日记信息,并将输入的信息保存到文件。 注意:在写入文件时,需要将文字符编码格式设置为 utf-8,否则会出现乱码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaozhima-dun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值