杨老师课堂_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)咨询。
杨老师课堂_Java核心技术下之控制台模拟记事本案例的更多相关文章
- 杨老师课堂_Java核心技术下之控制台模拟微博用户注册案例
案例设计背景介绍: 编写一个新浪微博用户注册的程序,要求使用HashSet集合实现. 假设当用户输入用户名.密码.确认密码.生日(输入格式yyyy-mm-dd为正确).手机号码(手机长度为11位,并 ...
- 杨老师课堂_VBA学习教程之根据部门列创建工作表
课件下载 : 方式1:本节课件下载地址:链接: https://pan.baidu.com/s/1rf5pRmZ95fjVbz70KYi6Aw 密码: q9yk 方式2:或点击此处下载 效果预览图: ...
- 杨老师课堂之JavaScript定时器_农夫山泉限时秒杀案例
预览效果图: 使用到的知识点: 定时器 setInterval(函数,毫秒):在指定的毫秒数后调用函数或执行一段代码 取消定时器 clearInterval:取消由setInterval设置的定时器 ...
- 互评Alpha版本——杨老师粉丝群——Pinball
一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 成语学习对除汉语言专业外的大学生的需求并不是很高,初中生和高中生因为在升学时需要参加语文 ...
- Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法
Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...
- 271. 杨老师的照相排列【线性DP】
杨老师希望给他的班级拍一张合照. 学生们将站成左端对齐的多排,靠后的排站的人数不能少于靠前的排. 例如,12名学生(从后向前)可以排列成每排5,3,3,1人,如下所示: X X X X X X X X ...
- Final互评------《弹球学成语》---- 杨老师粉丝群
一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题; N(Need,需求):本产品面相青少年及小学生,基于这些用户数量再加上一些休闲玩家,需求量还是比较大的. A ...
- Final版本互评——杨老师粉丝群《PinBall》
基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着民族自信的觉醒,民主文化越来越受到重视,语文在高考中的比重也不断增加,在这种大环境下,成 ...
- 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)C 勤奋的杨老师【DP/正反LIS/类似合唱队形】
链接:https://www.nowcoder.com/acm/contest/116/C 来源:牛客网 题目描述 杨老师认为他的学习能力曲线是一个拱形.勤奋的他根据时间的先后顺序罗列了一个学习清单, ...
随机推荐
- 开源视频平台:ViMP
ViMP是一个开源的视频平台,可以用于建立自己的视频门户.可以用于VoD系统,网络学习系统,企业内部视频系统的搭建. 这一阵子一直在研究网络视频平台.发现这类的开源系统相对来说还是比较少的,因此在发现 ...
- Linux System Programming --Chapter Seven
文件和目录管理 一.文件与其元数据 我们首先看一下一个简单的文本文件是怎么保存的: 打开vim,编辑一段文本: [root@localhost ~]# vim hello.txt 编辑内容如下: op ...
- Material Design之NavigationView和DrawerLayout实现侧滑菜单栏
本文将介绍使用Google最新推出规范式设计中的NavigationView和DrawerLayout结合实现侧滑菜单栏效果,NavigationView是android-support-design ...
- android 屏幕适配,hdpi,xhdpi,xxhdpi理解,常见出图
屏幕适配 首先理解下各个尺寸单位代表的意思 尺寸含义 px: 像素 dip: Density-independent pixel 独立像素密度 dpi: dot per inch 分辨率 ppi: p ...
- FFMPEG结构体分析:AVIOContext
注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...
- 让App中加入LruCache缓存,轻松解决图片过多造成的OOM
上次有过电话面试中问到Android中的缓存策略,当时模糊不清的回答,现在好好理一下吧. Android中一般情况下采取的缓存策略是使用二级缓存,即内存缓存+硬盘缓存->LruCache+Dis ...
- 一步操作关闭iOS状态栏(电池栏)
状态栏某时也蛮碍眼的: 将其关闭很简单:打开项目的info.plist文件,添加新的属性为NO的一行 View controller-based status bar appearance : 最后结 ...
- Linux中find的使用(转)
本文转自:迷途花开 另一值得参考的是吴秦先生的博文linux中强大且常用命令:find.grep. find命令用于查找文件和目录,任何位于参数之前的字符串都将被视为欲查找的目录. find 可以指定 ...
- iOS评分功能、APP中打开其他应用程序
1.评分功能 iOS中评分支持功能开发非常简单. NSString *str = [NSString stringWithFormat: @"itms-apps://itunes.apple ...
- java多线程的基础-java内存模型(JMM)
在并发编程中,需要处理两个关键问题:线程之间如何通信,以及线程之间如何同步.通信是指线程之间如何交换信息,在命令式编程中,线程之间的通信机制有两种:内存共享和消息传递. 同步是指程序中用于控 ...