杨老师课堂_Java核心技术下之控制台模拟记事本案例 ...

news/2024/7/1 5:37:26

预览效果图:

背景介绍:

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

要求在程序中:

  用户输入指令1代表“新建文件”,此时可以从控制台获取用户输入的文件内容;

  指令2代表打开文件,此时可将指定路径的txt文件的内容展现到控制台,

  指令3代表修改文件,此时即可以修改新建文件的内容,也可以修改打开文件的内容;

  指令4代表保存,此时如果是新建的文件需要保存,则将文件保存到用户输入的路径,如果是打开的文件需要保存,则将原来内容覆盖;

  指令5代表退出系退出本系统,例如输入指令1之后输入内容再输入指令4和文件保存的路径,此时可将输入内容保存至指定的路径。

  输入指令2之后,输入想要查看的文件的路径,在输入指令3以及要修改内容,再输入指令4,此时完成指定路径下的文件的修改.

  

示例代码:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;import org.junit.Test;/*** Date:2018-05-14* @author Mryang* 思路分析:1. 根据任务介绍和运行结果分析可知,此任务需要创建一个记事本类,在类中可以使用while循环实现控制台中操作指令的多次输入,使用switch语句根据控制台输入的操作指令来判断执行什么操作。2. 输入指令1时进行新建文件操作,此时需要从控制台获取输入内容,并暂存到全局变量中,以便后期进行保存和修改内容时使用,可以使用StringBuffer来保存控台中的每次输入的内容,输入内容是可能会涉及换行,这里使用while循环来循环输入,每循环一次可以将控制台获取的内容进行拼接换行符后,追加到文本内容中,当内容中输入“stop”字符串时,需要文本内容的操作结束,并将新建文本的内容暂存在全局变量中。3.执行指令2时可以打开指定路径的文件,由于是模拟记事本程序,因此限定词功能只可以打开txt文件,此操作首先要获取输入的路径,判断此路径的文件是否是txt文件,如果是则通过字符流读取此文件,然后将此文件的内容打印到控制台,并且暂存在全局变量中,将文件的路径也保存在全局变量中。4. 执行指令3时,可以对暂存在全局变量中的文本内容进行修改,修改后的内容也需要暂存到全局变量中,此操作首先要判断一下修改之前是否先经过新建文件或者打开文件操作,当确认经过上述操作后,可以将输入的字符串与文本内容中目标字符串进行替换,来完成修改内容功能。修改过程中,可以通过while循环来进行多次修改,当捕捉到“stop”字符串时,修改结束并将修改后的内容暂存到全局变量中。5. 执行指令4时,将所有全局变量中的内容保存到本地,如果是新建的文件则保存到用户输入的路径,如果是打开后的文件,则将原文件覆盖,可以通过文件路径的全局变量判断是哪种保存方式。当是打开文件的方式是直接通过字符流写入,当是新建的文件是先获取用户输入的路径,再用字符流写入6. 执行指令5时,直接退出系统,可以通过代码System.exit(0)实现。*/
public class Notepad {private  String filePath;private  String message;@Testpublic  void notepadTest() throws Exception {Scanner scanner = new Scanner(System.in);System.out.println("------------1.新建文件    2.打开文件    3.修改文件    4.保存文件    5.退出系统-----------");while (true) {System.out.println("请输入操作命令:");int command = scanner.nextInt();switch (command) {case 1:createFile();break;case 2:openFile();break;case 3:editFile();break;case 4:saveFile();break;case 5:exit();break;default:System.out.println("您输入的命令有误!");break;}}}/*** 退出系统*/private static void exit() {System.out.println("您已经退出系统");System.exit(0);}/*** 修改文件: 通过字符串替换的形式 */private  void editFile() {if (message == "" && filePath == null) {System.out.println("请先新建文件或者打开文件");return;}Scanner scan = new Scanner(System.in);System.out.println("请输入要修改的内容(以\"修改的目标文字:修改之后的文字\"格式),"+"停止修改请输入\"stop\"");//提示String inputMessage = "";while (!inputMessage.equals("stop")) {//当输入“stop”时,停止输入inputMessage = scan.nextLine();if (inputMessage != null && inputMessage.length() > 0) {String[] editMessage = inputMessage.split(":");if (editMessage != null && editMessage.length > 1) {message = message.replace(editMessage[0],editMessage[1]);}}}System.out.println("修改后的内容:" + "\r\n" + message);}/*** 打开文件* @throws Exception */private  void openFile() throws Exception {message  = "";Scanner scan = new Scanner(System.in);System.out.println("请输入打开文件的位置:");filePath = scan.next();//控制只能输入txt格式文件路径if (filePath != null && !filePath.endsWith(".txt")) {System.out.print("请选择文本文件!");
//            System.out.println(222);return;}FileReader  in = new  FileReader(filePath);//实例化一个FileReader对象char[] charArray = new char[1024];//缓冲数组int len = 0;StringBuffer sb  = new StringBuffer();//循环读取  一次读取一个字符数组while ((len  = in.read(charArray)) != -1) {sb.append(charArray);}message = sb.toString();System.out.println("打开文件内容:" + "\r\n" + message);in.close();}/*** 新建文件:从控制台中获取文件*/private  void createFile() {message = "";//新建文件时,暂存的文件清空Scanner scanner = new Scanner(System.in);System.out.println("请输入内容,停止请输入stop :");StringBuffer stringBuffer = new StringBuffer();String inputMessage = "";//用于存储客户输入的数据while (!inputMessage.equals("stop")) {//当输入stop时。停止输入if (stringBuffer.length()>0) {//如果有内容stringBuffer.append("\r\n");//追加换行符
            }stringBuffer.append(inputMessage);//拼接输入的信息inputMessage= scanner.nextLine();}message = stringBuffer.toString();}/***  保存文件* @throws IOException*/private  void saveFile() throws IOException {Scanner scan =  new Scanner(System.in);FileWriter out = null ;if (filePath != null) {//文件是有“打开”载入out = new  FileWriter(filePath);//将原文件覆盖}else{//新建的文件System.out.println("请输入文件保存的绝对路径");String path = scan.next();//获取文件保存的路径filePath = path;//将输入路径中大写字母替换成小写字母后判断是不是文本格式if (!filePath.toLowerCase().endsWith(".txt")) {filePath += ".txt";}out = new FileWriter(filePath);//构造输出流
        }out.write(message);//写入暂存的内容out.close();    //  关闭输出流message ="";    //  修改文件前先将写入内容置空filePath = null;//  将文件路径置空
    }}

分割线 
作者: 杨校

出处: http://www.cnblogs.com/xiaoxiao5016

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询。


http://lihuaxi.xjx100.cn/news/247081.html

相关文章

GTest使用笔记

1. C测试框架 1.1. CppUnit 这是一个与JUnit类似的框架,这个框架很陈旧了,并且有着一些缺点,例如一些类可以消失,一些类名应该修改,一些宏定义应该修改,帮助很少很乱等。 1.2. CxxTest 因为CppUnit有着…

mysql 加快命中_合理配置MySQL缓存 提高缓存命中率

众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍。故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率。MySQL数据库也不例外。在这里,笔者将结合自己的工…

制作OpenStack上使用的CentOS系统镜像

很多进行Openstack测试的人都发现,自己的openstack测试环境搭建的很成功,安全策略也添加了,但是上传镜像之后,却出现无法Ping通,无法ssh到实例等问题,实际上这很可能是由于我们没有使用一个正确的镜像导致的…

python argparser模块的相关使用

最近写的代码,需要很多文件的输入输出,每次更换文件都要一个个py文件进入,然后更换,非常不方便,由此想到了,采用python命令行模块解决更换的麻烦,通过命令行的模式,在一个py模块中创…

Linux下用火焰图进行性能分析

软件的性能分析, 往往需要查看 CPU 耗时, 了解瓶颈在哪里。火焰图(flame graph) 是性能分析的利器 1. 火焰图简介 很多人感冒发烧的时候, 往往会模仿神农氏尝百草的路子: 先尝尝抗病毒的药, 再试试抗细菌的药, 甭管家里有什么药挨个试, 什么中药西药, 瞎猫总会碰上死耗子, 如…

Python编程规范及性能优化

为什么80%的码农都做不了架构师?>>> Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- 。设置编辑器,默认保存为 utf-8 格式。 注释 业界普遍认同 Python 的注释分为两种的概念,一种是由 # 开…

使用XHProf分析PHP性能瓶颈(二)

上一篇文章里,我们介绍了如何基于xhprof扩展来分析PHP性能,并记录到日志里,最后使用xhprof扩展自带的UI在web里展示出来。本篇文章将讲述2个知识点: 使用xhgui代替xhprof的默认UI界面,更便于分析使用tideways扩展替换x…

npm 重新安装依赖_npm-shrinkwrap锁定依赖

写在前面npm采用语义化的版本号 semver 进行控制,让开发过程中依赖的获取和升级变得非常容易,但不严格的版本号控制,也带来了不确定性~~npm 建议使用semver版本,部分包不遵循semver;package.json 可以使用精确的版本号…