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

news2024/12/19 23:38:35

【实验7-4】  升级版日记本

【任务介绍】

  1.任务描述

本案例要求编写一个模拟日记本的程序,通过在控制台输入指令,实现在本地新建日记本、打开日记本和修改日记本等功能。

  1. 用户输入指令1代表“新建日记本”,可以从控制台获取用户输入的日记内容。
  2. 指令2代表“打开日记本”,读取指定路径的txt文件的内容并输出到控制台。
  3. 指令3代表“修改日记本”,修改日记时,既可以修改新建日记本的内容,也可以修改已打开日记本的内容。
  4. 指令4代表“保存”,如果是新建的日记本需要保存,则将日记本保存到用户输入的路径;如果是打开的日记本需要保存,则将原来内容覆盖;
  5. 指令5代表“退出”,即退出本系统。

2.运行结果

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

图7-1 运行结果

运行过程中,本地D:\chapter07\task02路径下生成了note.txt文件,打开后如图7-2所示。

图7-2 生成的文件

运行结束后,本地D:\chapter07\task02路径下的note.txt文件已经修改,打开后如图7-3所示。

图7-3 修改后的文件

 

【实现思路】

(1)根据任务介绍和运行结果分析可知,此任务需要创建一个记事本类,在类中可以使用while循环实现控制台中操作指令的多次输入,使用switch语句根据控制台输入的操作指令来判断执行什么操作。

(2)输入指令1时进行新建文件操作,此时需要从控制台获取输入的内容并暂存到全局变量中,以便后期进行保存和修改内容时使用。可以使用StringBuffer来保存控制台中每次输入的内容,输入内容时可能会涉及换行,这里可以使用while循环来循环输入,每循环一次都将控制台获取的内容拼接换行符后,追加到文本内容中,当内容中输入“stop”字符串时,输入文本内容的操作结束,并将新建文本的内容暂存在全局变量中。

(3)执行指令2时,可以打开指定路径的文件,由于是模拟记事本程序,因此限定此功能只支持打开txt文件。此操作首先要获取输入的路径,判断此路径的文件是否是txt文件,如果是则通过字符流读取此文件,然后将此文件的内容打印至控制台,并且暂存在全局变量中,将文件的路径也保存至全局变量中。

(4)执行指令3时,可以对暂存在全局变量中的文本内容进行修改,修改后的内容也需要暂存到全局变量中。此操作首先要判断一下修改之前是否先经过新建文件或者打开文件操作,当确认经过上述操作后,可以将输入的字符串与文本内容中目标字符串进行替换,来完成修改内容功能。修改过程可通过while循环来进行多次的修改,当捕捉到“stop”字符串时修改结束,并将修改后的内容暂存到全局变量中。

(5)执行指令4时,将所有全局变量中的内容保存至本地,如果是新建的文件则保存至用户输入的路径,如果是打开后的文件则将原文件覆盖。可以通过文件路径的全局变量判断是哪种保存方式,当是打开文件的方式时,直接通过字符流写入;当是新建的方式时,先获取用户输入的路径,再用字符流写入。

(6)执行指令5,直接退出系统,可以通过代码“System.exit(0);”实现。

【实现代码】

    (1)创建记事本类,在类中编写执行程序的main方法,如文件7-1所示。

  1.  Notepad.java
  1. package chapter0704;
  2. import java.io.FileReader;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.util.Scanner;
  6. public class Notepad {
  7.     private static String filePath;
  8.     private static String message = "";
  9.     public static void main(String[] args) throws Exception {
  10.         Scanner sc = new Scanner(System.in);
  11.     System.out.println("--1:新建文件 2:打开文件 3:修改文件  4:保存 5:退出--");
  12.         while (true) {
  13.            System.out.print("请输入操作指令:");
  14.            int command = sc.nextInt();
  15.            switch (command) {
  16.            case 1:
  17.                createFile();//1:新建文件
  18.                break;
  19.            case 2:
  20.                openFile();// 2:打开文件
  21.                break;
  22.            case 3:
  23.                editFile();//3:修改文件
  24.                break;
  25.            case 4:
  26.                saveFile();// 4:保存
  27.                break;
  28.            case 5:
  29.                exit();//5:退出
  30.                break;
  31.            default:
  32.                System.out.println("您输入的指令错误!");
  33.                break;
  34.            }
  35.         }
  36.     }
  37. }

在文件7-1中,第7行和第8行分别创建了文件路径和内容的全局变量。第12~35行代码,是循环主体,用于循环接收用户的指令。当从第14行代码获取指令后,通过switch语句判断应该执行的操作。

(2)在Notepad中编写新建文件方法,如文件7-2所示。

  1.  createFile()
  1.     /**
  2.      * 新建文件  从控制台获取内容
  3.      */
  4.     private static void createFile() {
  5.         message = "";//新建文件时,暂存文件内容清空
  6.         Scanner sc = new Scanner(System.in);
  7.         System.out.println("请输入内容,停止编写请输入\"stop\":");//提示
  8.         StringBuffer stb = new StringBuffer();//用于后期输入内容的拼接
  9.         String inputMessage = "";
  10.         while (!inputMessage.equals("stop")) {//当输入“stop”时,停止输入
  11.            if (stb.length() > 0) {
  12.                stb.append("\r\n");//追加换行符
  13.            }
  14.            stb.append(inputMessage);//拼接输入信息
  15.            inputMessage = sc.nextLine();//获取输入信息
  16.         }
  17.         message = stb.toString();//将输入内容暂存
  18.     }

在文件7-2中,createFile()方法是Notepad类中的新建文件方法。第5行代码用于将文件内容清空。第8行代码定义了一个字符串缓冲区StringBuffer,用于存储每次控制台输入的内容。第10~16行代码,通过while循环,使控制台可以多次输入内容,每次输入结束后,就将输入字符串拼入字符串缓冲区中,并在末尾追加一个换行符,直至输入“stop”字符串时循环结束,输入停止。第17行代码,将StringBuffer中的数据转成String类型,并存入全局变量message中,以便修改和保存时使用。

(3)在Notepad中编写打开文件方法,如文件7-3所示。

  1.  openFile()
  1.     /**
  2.      * 打开文件
  3.      */
  4.     private static void openFile() throws Exception {
  5.         message = "";//打开文件时,将暂存内容清空
  6.         Scanner sc = new Scanner(System.in);
  7.         System.out.print("请输入打开文件的位置:");
  8.         filePath = sc.next();//获取打开文件的路径
  9.         //控制只能输入txt格式的文件路径
  10.         if (filePath != null && !filePath.endsWith(".txt")) {
  11.            System.out.print("请选择文本文件!");
  12.            return;
  13.         }
  14.         FileReader in = new FileReader(filePath);//实例化一个FileReader对象
  15.         char[] charArray = new char[1024];//缓冲数组
  16.         int len = 0;
  17.         StringBuffer sb = new StringBuffer();
  18.         // 循环读取,一次读取一个字符数组
  19.         while ((len = in.read(charArray)) != -1) {
  20.            sb.append(charArray);
  21.         }
  22.         message = sb.toString();//将打开文件内容暂存
  23.        System.out.println("打开文件内容:" + "\r\n" + message);
  24.         in.close();// 释放资源
  25.     }

在文件7-3中,openFile()方法是Notepad类中的打开文件方法。第5行代码实现将内容的message全局变量清空。第6~8行获取到控制台传入的文件打开的路径,并将其存储到filePath全局变量中。第10~13行代码,判断将要打开的文件的格式是否是文本文件。第14~21行代码,利用了字符输入流读取文件的内容。第22行代码,将StringBuffer中的内容转成String类型,并存入全局变量message中,以便修改和保存时使用。

(4)在Notepad中编写修改文件方法,如文件7-4所示。

  1.  editFile()
  1.     /**
  2.      * 修改文件内容    通过字符串替换的形式
  3.      */
  4.     private static void editFile() {
  5.         if(message == "" && filePath == null){
  6.            System.out.println("请先新建文件或者打开文件");
  7.            return;
  8.         }
  9.         Scanner sc = new Scanner(System.in);
  10.         System.out.println("请输入要修改的内容(以 \"修改的目标文字:修改之后的文字\" 格式),"
  11.                + "停止修改请输入\"stop\":");
  12.         String inputMessage = "";
  13.        while (!inputMessage.equals("stop")) {//当输入stop,停止修改
  14.            inputMessage = sc.nextLine();
  15.            if (inputMessage != null && inputMessage.length() > 0) {
  16.                // 将输入的文字根据“:”拆分成数组
  17.                 String[] editMessage = inputMessage.split(":");
  18.                if (editMessage != null && editMessage.length > 1) {
  19.                //根据输入的信息将文件中内容替换
  20.                message=message.replace(editMessage[0], editMessage[1]);
  21.                }
  22.            }
  23.         }
  24.        System.out.println("修改后的内容:" + "\r\n" + message);
  25.     }

在文件7-4中,editFile()是Notepad类中的修改文件方法。第13~23行代码,使用while循环实现多次替换文件内容的功能,每次由第14行代码获取替换的指令,再由第17行代码将其根据“:”拆分成数组(:是英文格式的),并再将内容的全局变量message进行替换,此时注意判断数组长度,否则容易报数组下标越界的错误。

(5)编写保存文件方法,如文件7-5所示。

  1.  saveFile()
  1.     /**
  2.      * 保存  新建文件存在用户输入的路径  打开的文件将原文件覆盖
  3.      */
  4.     private static void saveFile() throws IOException {
  5.         Scanner sc = new Scanner(System.in);
  6.         FileWriter out = null;
  7.         if (filePath != null) {// 文件是由“打开”载入的
  8.            out = new FileWriter(filePath);//将原文件覆盖
  9.         } else {//新建的文件
  10.            System.out.print("请输入文件保存的绝对路径:");
  11.            String path = sc.next();//获取文件保存的路径
  12.            filePath = path;
  13.            //将输入路径中大写字母替换成小写字母后判断是不是文本格式
  14.            if (!filePath.toLowerCase().endsWith(".txt")) {
  15.                filePath += ".txt";
  16.            }
  17.            out = new FileWriter(filePath);// 构造输出流
  18.         }
  19.         out.write(message);//写入暂存的内容
  20.         out.close();//关闭输出流
  21.         message = "";// 修改文件前现将写入内容置空
  22.         filePath = null;//将文件路径至null
  23.     }

在文件7-5中,saveFile()方法是Notepad类中的保存文件的方法。第7行代码,根据路径的全局变量是否为空,来判断此时内容的全局变量是新建文件产生的还是打开文件产生的,如果是打开文件产生的,则用第8行代码,将此文件覆盖掉,如果是新建文件产生的,则执行第10~17行代码。第11行代码获得控制台输入的路径之后,执行第14到16行的代码判断其是否是文本格式,如果不是将其转换成文本格式。第19行代码将message中暂存的内容写入文本文件。最后第21和22行的代码将文件路径和文件内容的全局变量message置空,完成了一次对文本的操作。

(6)编写退出程序的方法,如文件7-6所示。

  1.  exit()
  1.     /**
  2.      * 退出
  3.      */
  4.     private static void exit() {
  5.         System.out.println("您已退出系统,谢谢使用!");
  6.         System.exit(0);
  7.     }

在文件7-6中,exit()方法是Notepad类中的退出的方法。第6行代码执行了退出的命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物联网MQTT协议简单介绍

物联网曾被认为是继计算机、互联网之后,信息技术行业的第三次浪潮。随着基础通讯设施的不断完善,尤其是 5G 的出现,进一步降低了万物互联的门槛和成本。物联网本身也是 AI 和区块链应用很好的落地场景之一,各大云服务商也在纷纷上…

mysql8.0-日志

目录 错误日志 错误日志主要记录如下几种日志: 查询日志 测试 慢查询日志 二进制日志 日志格式 日志查看 修改日志格式 二进制日志的删除 二进制日志的还原 错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysql启动和停止时,…

【Python基础】类

面向对象编程 面向对象编程是最有效的软件编写方法之一。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象和面向过程的区别 比如我想吃西红柿炒蛋,怎么运用面向过程的方法来解决这个问题呢?…

怕上当?来看这份网络钓鱼和诈骗技术趋势

网络钓鱼和诈骗:当前的欺诈类型 网络钓鱼 钓鱼者可以攻击任何在线服务——银行、社交网络、政府门户网站、在线商店、邮件服务、快递公司等——中的证书。但是,顶级品牌的客户往往面临更大风险,因为相比小品牌,人们更喜欢使用和…

12 个适合做外包项目的开源后台管理系统

1.D2admin 开源地址:https://github.com/d2-projects/d2-admin 文档地址:https://d2.pub/zh/doc/d2-admin/ 效果预览:https://d2.pub/d2-admin/preview/#/index 开源协议:MIT 2.vue-element-admin 开源地址:https…

BACnet协议详解————MS/TP物理层,数据链路层和网络层

文章目录写在前面1 物理层2 数据链路层MSTP的流程如下noteMS/TP帧格式3 网络层写在前面 这周加更一篇,来弥补一下之前落下的进度。简单的说两句,之前讲应用层的时候,只是跟官方的手册来同步一下,但是从个人理解来说,自…

Spring拦截器

SpringMVC提供了拦截器机制,允许运行目标方法之前进行一些拦截工作或者目标方法运行之后进行一下其他相关的处理。自定义的拦截器必须实现HandlerInterceptor接口。preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求…

(周末公众号解读系列)2000字-视觉SLAM综述

参考链接:https://mp.weixin.qq.com/s?__bizMzg2NzUxNTU1OA&mid2247528395&idx1&sn6c9290dd7fd926f11cbaca312fbe99a2&chksmceb84202f9cfcb1410353c805b122e8df2e2b79bd4031ddc5d8678f8b11c356a25f55f488907&scene126&sessionid1677323905…

10 分钟把你的 Web 应用转为桌面端应用

在桌面端应用上,Electron 也早已做大做强,GitHub桌面端、VSCode、Figma、Notion、飞书、剪映、得物都基于此。但最近后起之秀的 Tauri 也引人注目,它解决了 Electron 一个大的痛点——打包产物特别大。 我们知道 Electron 基于谷歌内核 Chro…

C++回顾(二)——const和引用

2.1 C中的const 2.1.1 C与C中const的比较 (1)C语言中的const C语言中 const修饰的变量是一个 常变量,本质还是变量,有自己的地址空间。 (2)C中的const 1、C中 const 变量声明的是一个真正的常量&#xff…

24 openEuler管理进程-调度启动进程

文章目录24 openEuler管理进程-调度启动进程24.1 定时运行一批程序(at)24.1.1 at命令24.1.2 设置时间24.1.3 执行权限24.2 周期性运行一批程序(cron)24.2.1 运行机制24.2.2 crontab命令24.2.3 crontab文件24.2.4 编辑配置文件操作…

Linux基础命令-whereis查找命令及相关文件

文章目录 whereis 命令介绍 命令格式 基本参数 参考实例 1)查找date命令及相关文件 2)只显示date的二进制文件 3)只显示源代码文件 4)指定目录查找二进制文件 which与whereis对比 命令总结 whereis 命令介绍 通过帮助…

【TCSVT22】Pareto Refocusing for Drone-view Object Detection【航拍目标检测】

论文与代码论文地址:https://ieeexplore.ieee.org/document/9905640/代码地址:未开源背景与动机作者认为阻碍航拍场景目标检测发展的原因主要有以下两个:航拍图像中存在大量困难目标,文中作者把困难目标总结为小目标和遮挡的目标。…

机械革命旷世G16电脑开机变成绿屏了无法使用怎么办?

机械革命旷世G16电脑开机变成绿屏了无法使用怎么办?最近有用户使用的机械革命旷世G16电脑一开机之后,电脑屏幕就变成了绿色的,无法进行任何的操作。出现这个问题可能是因为电脑中病毒了,或者是系统出现故障。我们可以通过U盘来重新…

实习-----Mybatis 框架

Mybatis 框架ORM持久化介绍 了解什么是“持久化”即把数据(如内存中的对象)保存的磁盘的某一文件中ORM概念ORM,即Object Relational Mapping,它是对象关系映射的简称。它的作用是在关系型数据库和对象之间作一个映射,是…

CNTM 和ADA线下会议总结!

预计CNTM将会是ADA和Ocean共同孵化的第二个AI项M!CNTM25号和ADA在台湾举办线下会议 并在近期CNTM和Ocean在一起交流AI技术,同时AGIX也是ADA和Ocean深度孵化的项目,预计CNTM将会是ADA和Ocean共同孵化的第二个AI项目!什么是 CNTM &a…

【测试平台系列】如何停止测试任务执行

今天我们就玩点好玩的,和大家一起探讨:怎么停止一段python代码。之后我们将会运用到pity之中。 知识要点 本文需要大家对asyncio相关知识有一些了解,至于原理方面,大家可以自行查阅,因为我也没细看。 为什么要做这个…

Spring使用mongoDB步骤

1. 在Linux系统使用docker安装mongoDB 1.1. 安装 在docker运行的情况下,执行下述命令。 docker run \ -itd \ --name mongoDB \ -v mongoDB_db:/data/db \ -p 27017:27017 \ mongo:4.4 \ --auth执行docker ps后,出现下列行,即表示mongoDB安…

【项目精选】网络考试系统的设计与实现(源码+视频+论文)

点击下载源码 网络考试系统主要用于实现高校在线考试,基本功能包括:自动组卷、试卷发布、试卷批阅、试卷成绩统计等。本系统结构如下: (1)学生端: 登录模块:登录功能; 网络考试模块…

gdb openocd jlink arm-a9调试

连接关系是这样的:gdb —> openocd —>(这里需要两个xx.cfg配置文件) jlink —> arm-a9板子 具体流程是这样的: 给jlink(硬件调试器)安装驱动,用USB Driver Tool这个软件,…