杨老师课堂_Java核心技术下之控制台模拟记事本案例
预览效果图:
背景介绍:
编写一个模拟记事本的程序通过在控制台输入指令,实现在本地新建文件打开文件和修改文件等功能。
要求在程序中:
用户输入指令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; @Test public 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)咨询。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
VS Code 自定义快捷输入
位置 ctrl+shift+p 搜索: snippets 输入类型: 比如 html、javascript 参数说明 prefix:使用代码段的快捷入口 body:需要设置的代码放在这里,字符串间换行的话使用\r\n换行符隔开.如果值里包含特殊字符需要进行转义,多行代码以","分隔(在引号后面写逗号) $0:定义最终光标位置 $1:定义第一次光标位置,按tab键可进行快速切换, 还可以有 $2, $3, $4, $5 ... description:代码段描述,在使用智能感知时的描述 常用字符说明 \\ 反斜杠 \a 警告 \b 退格符 \f 换页符 \n 换行符 \r 回车符 \t Tab 符 \v 垂直 Tab 符 \u 使用数字指定的Unicode 字符, 如 \u2000 \x 使用十六进制数指定的Unicode 字符, 如 \xc8 \0 空值 HTML //自定义 "phone": { "prefix": "ph", "body": [ "<!DOCTYPE html>", "<html lang='en'>", "<head>", " ...
- 下一篇
Java NIO 之 Buffer(缓冲区)
一 Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互。 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels. Buffer本质上就是一块内存区,可以用来写入数据,并在稍后读取出来。这块内存被NIO Buffer包裹起来,对外提供一系列的读写方便开发的接口。 在Java NIO中使用的核心缓冲区如下(覆盖了通过I/O发送的基本数据类型:byte, char、short, int, long, float, double ,long): ByteBuffer CharBuffer ShortBuffer IntBuffer FloatBuffer DoubleBuffer LongBuffer 利用Buffer读写数据,通常遵循四个步骤: 把数据写入buffer; 调用flip; 从Buffer中读取数据; 调用buffer.clear()或者buffer.compact()。 当写入数据到buffer中时,buffer会记录已经写入的数据大小。当需要读数据时,通过 flip() 方法把buffer从写模...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启