Java案例分析

【实验7-3】 日记本

2024-10-25 28 0

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

【实验7-3  日记本

【任务介绍】

  1.任务描述

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

  2.运行结果

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

upfile

7-2 运行结果

运行结束后在本地生成一个“黑马日记本.txt”文件,

【任务目标】

l  学会分析"日记本小功能"程序的实现思路。

l  根据思路独立完成"日记本小功能"的源代码编写、编译及运行。

l  掌握字节流操作本地文件的方法。

l  掌握ArrayListStringBuffer的使用,以及异常的处理。

【实现思路】

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

 

 


点赞 0

文章评论

欢迎您:

阿文博客

人生的价值,并不是用时间,而是用深度量去衡量的。——列夫·托尔斯泰

69 文章 1879 浏览 0 评论