预览效果图:

背景介绍:

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

要求在程序中:

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

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

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

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

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

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

  

示例代码:

  1. import java.io.FileReader;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.Scanner;
  5.  
  6. import org.junit.Test;
  7.  
  8. /**
  9. * Date:2018-05-14
  10. * @author Mryang
  11. * 思路分析:
  12. 1. 根据任务介绍和运行结果分析可知,此任务需要创建一个记事本类,
  13. 在类中可以使用while循环实现控制台中操作指令的多次输入,
  14. 使用switch语句根据控制台输入的操作指令来判断执行什么操作。
  15.  
  16. 2. 输入指令1时进行新建文件操作,此时需要从控制台获取输入内容,并暂存到全局变量中,
  17. 以便后期进行保存和修改内容时使用,可以使用StringBuffer来保存控台中的每次输入的内容,
  18. 输入内容是可能会涉及换行,这里使用while循环来循环输入,
  19. 每循环一次可以将控制台获取的内容进行拼接换行符后,追加到文本内容中,
  20. 当内容中输入“stop”字符串时,需要文本内容的操作结束,并将新建文本的内容暂存在全局变量中。
  21.  
  22. 3.执行指令2时可以打开指定路径的文件,由于是模拟记事本程序,
  23. 因此限定词功能只可以打开txt文件,此操作首先要获取输入的路径,判断此路径的文件是否是txt文件,
  24. 如果是则通过字符流读取此文件,然后将此文件的内容打印到控制台,并且暂存在全局变量中,将文件的路径也保存在全局变量中。
  25.  
  26. 4. 执行指令3时,可以对暂存在全局变量中的文本内容进行修改,
  27. 修改后的内容也需要暂存到全局变量中,此操作首先要判断一下修改之前是否先经过新建文件或者打开文件操作,
  28. 当确认经过上述操作后,可以将输入的字符串与文本内容中目标字符串进行替换,来完成修改内容功能。
  29. 修改过程中,可以通过while循环来进行多次修改,
  30. 当捕捉到“stop”字符串时,修改结束并将修改后的内容暂存到全局变量中。
  31.  
  32. 5. 执行指令4时,将所有全局变量中的内容保存到本地,如果是新建的文件则保存到用户输入的路径,
  33. 如果是打开后的文件,则将原文件覆盖,可以通过文件路径的全局变量判断是哪种保存方式。
  34. 当是打开文件的方式是直接通过字符流写入,当是新建的文件是先获取用户输入的路径,再用字符流写入
  35.  
  36. 6. 执行指令5时,直接退出系统,可以通过代码System.exit(0)实现。
  37. */
  38. public class Notepad {
  39.  
  40. private String filePath;
  41. private String message;
  42.  
  43. @Test
  44. public void notepadTest() throws Exception {
  45.  
  46. Scanner scanner = new Scanner(System.in);
  47.  
  48. System.out.println("------------1.新建文件 2.打开文件 3.修改文件 4.保存文件 5.退出系统-----------");
  49.  
  50. while (true) {
  51. System.out.println("请输入操作命令:");
  52. int command = scanner.nextInt();
  53. switch (command) {
  54. case 1:
  55. createFile();
  56. break;
  57. case 2:
  58. openFile();
  59. break;
  60. case 3:
  61. editFile();
  62. break;
  63. case 4:
  64. saveFile();
  65. break;
  66. case 5:
  67. exit();
  68. break;
  69.  
  70. default:
  71. System.out.println("您输入的命令有误!");
  72. break;
  73. }
  74. }
  75. }
  76.  
  77. /**
  78. * 退出系统
  79. */
  80. private static void exit() {
  81. System.out.println("您已经退出系统");
  82. System.exit(0);
  83. }
  84.  
  85. /**
  86. * 修改文件: 通过字符串替换的形式
  87. */
  88. private void editFile() {
  89. if (message == "" && filePath == null) {
  90. System.out.println("请先新建文件或者打开文件");
  91. return;
  92. }
  93. Scanner scan = new Scanner(System.in);
  94. System.out.println("请输入要修改的内容(以\"修改的目标文字:修改之后的文字\"格式),"+"停止修改请输入\"stop\"");//提示
  95. String inputMessage = "";
  96. while (!inputMessage.equals("stop")) {//当输入“stop”时,停止输入
  97. inputMessage = scan.nextLine();
  98. if (inputMessage != null && inputMessage.length() > 0) {
  99. String[] editMessage = inputMessage.split(":");
  100. if (editMessage != null && editMessage.length > 1) {
  101. message = message.replace(editMessage[0],editMessage[1]);
  102. }
  103.  
  104. }
  105. }
  106. System.out.println("修改后的内容:" + "\r\n" + message);
  107. }
  108.  
  109. /**
  110. * 打开文件
  111. * @throws Exception
  112. */
  113. private void openFile() throws Exception {
  114. message = "";
  115. Scanner scan = new Scanner(System.in);
  116. System.out.println("请输入打开文件的位置:");
  117. filePath = scan.next();
  118. //控制只能输入txt格式文件路径
  119. if (filePath != null && !filePath.endsWith(".txt")) {
  120. System.out.print("请选择文本文件!");
  121. // System.out.println(222);
  122. return;
  123. }
  124. FileReader in = new FileReader(filePath);//实例化一个FileReader对象
  125. char[] charArray = new char[1024];//缓冲数组
  126. int len = 0;
  127. StringBuffer sb = new StringBuffer();
  128. //循环读取 一次读取一个字符数组
  129. while ((len = in.read(charArray)) != -1) {
  130. sb.append(charArray);
  131. }
  132. message = sb.toString();
  133. System.out.println("打开文件内容:" + "\r\n" + message);
  134. in.close();
  135.  
  136. }
  137.  
  138. /**
  139. * 新建文件:从控制台中获取文件
  140. */
  141. private void createFile() {
  142. message = "";//新建文件时,暂存的文件清空
  143. Scanner scanner = new Scanner(System.in);
  144. System.out.println("请输入内容,停止请输入stop :");
  145.  
  146. StringBuffer stringBuffer = new StringBuffer();
  147.  
  148. String inputMessage = "";//用于存储客户输入的数据
  149.  
  150. while (!inputMessage.equals("stop")) {//当输入stop时。停止输入
  151. if (stringBuffer.length()>0) {//如果有内容
  152. stringBuffer.append("\r\n");//追加换行符
  153. }
  154. stringBuffer.append(inputMessage);//拼接输入的信息
  155. inputMessage= scanner.nextLine();
  156.  
  157. }
  158. message = stringBuffer.toString();
  159.  
  160. }
  161. /**
  162. * 保存文件
  163. * @throws IOException
  164. */
  165. private void saveFile() throws IOException {
  166. Scanner scan = new Scanner(System.in);
  167. FileWriter out = null ;
  168. if (filePath != null) {//文件是有“打开”载入
  169. out = new FileWriter(filePath);//将原文件覆盖
  170. }else{//新建的文件
  171. System.out.println("请输入文件保存的绝对路径");
  172. String path = scan.next();//获取文件保存的路径
  173. filePath = path;
  174. //将输入路径中大写字母替换成小写字母后判断是不是文本格式
  175. if (!filePath.toLowerCase().endsWith(".txt")) {
  176. filePath += ".txt";
  177. }
  178. out = new FileWriter(filePath);//构造输出流
  179. }
  180. out.write(message);//写入暂存的内容
  181. out.close(); // 关闭输出流
  182. message =""; // 修改文件前先将写入内容置空
  183. filePath = null;// 将文件路径置空
  184. }
  185.  
  186. }

 
作者: 杨校

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

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

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

杨老师课堂_Java核心技术下之控制台模拟记事本案例的更多相关文章

  1. 杨老师课堂_Java核心技术下之控制台模拟微博用户注册案例

    案例设计背景介绍: 编写一个新浪微博用户注册的程序,要求使用HashSet集合实现.  假设当用户输入用户名.密码.确认密码.生日(输入格式yyyy-mm-dd为正确).手机号码(手机长度为11位,并 ...

  2. 杨老师课堂_VBA学习教程之根据部门列创建工作表

    课件下载 : 方式1:本节课件下载地址:链接: https://pan.baidu.com/s/1rf5pRmZ95fjVbz70KYi6Aw 密码: q9yk 方式2:或点击此处下载 效果预览图: ...

  3. 杨老师课堂之JavaScript定时器_农夫山泉限时秒杀案例

    预览效果图: 使用到的知识点: 定时器 setInterval(函数,毫秒):在指定的毫秒数后调用函数或执行一段代码 取消定时器 clearInterval:取消由setInterval设置的定时器 ...

  4. 互评Alpha版本——杨老师粉丝群——Pinball

    一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 成语学习对除汉语言专业外的大学生的需求并不是很高,初中生和高中生因为在升学时需要参加语文 ...

  5. Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

    Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...

  6. 271. 杨老师的照相排列【线性DP】

    杨老师希望给他的班级拍一张合照. 学生们将站成左端对齐的多排,靠后的排站的人数不能少于靠前的排. 例如,12名学生(从后向前)可以排列成每排5,3,3,1人,如下所示: X X X X X X X X ...

  7. Final互评------《弹球学成语》---- 杨老师粉丝群

    一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题;  N(Need,需求):本产品面相青少年及小学生,基于这些用户数量再加上一些休闲玩家,需求量还是比较大的.   A ...

  8. Final版本互评——杨老师粉丝群《PinBall》

    基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着民族自信的觉醒,民主文化越来越受到重视,语文在高考中的比重也不断增加,在这种大环境下,成 ...

  9. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)C 勤奋的杨老师【DP/正反LIS/类似合唱队形】

    链接:https://www.nowcoder.com/acm/contest/116/C 来源:牛客网 题目描述 杨老师认为他的学习能力曲线是一个拱形.勤奋的他根据时间的先后顺序罗列了一个学习清单, ...

随机推荐

  1. C++异常处理 - 栈解旋,异常接口声明,异常类型和异常变量的生命周期

    栈解旋(unwinding) 异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构.析构的顺序与构造的顺序相反.这一过程称为栈的解旋(unwinding). d ...

  2. 手把手带你画一个漂亮蜂窝view Android自定义view

    上一篇做了一个水波纹view  不知道大家有没有动手试试呢点击打开链接 这个效果做起来好像没什么意义,如果不加监听回调 图片就能直接替代.写这篇博客的目的是锻炼一下思维能力,以更好的面多各种自定义vi ...

  3. 2015年北京的第一场雪-关于android学习的思考(84)

    今天是2015年11月6日,今天北京下了大雪,我听着民谣,发现丢火车的摇滚也还不错,我身体的一部分毛发也发生了变异,由黑色变成红色,一切来的太突然了......不知不觉学习android开发2年多了, ...

  4. 图像检索:CEDD(Color and Edge Directivity Descriptor)算法

    颜色和边缘的方向性描述符(Color and Edge Directivity Descriptor,CEDD) 本文节选自论文<Android手机上图像分类技术的研究>. CEDD具有抽 ...

  5. Handler学习小结

    在android消息机制中Handler扮演着举足轻重的作用,(AsnyTask其实也是对Handler+Thread做了一层封装),ui线程超过5s就会报出ANR,一般耗时操作操作需要放在子线程中处 ...

  6. 套接字编程相关函数(1:套接字地址结构、字节序转换、IP地址转换)

    1. 套接字地址结构 1.1 IPv4套接字地址结构 IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinet/in.h>头文件中.下 ...

  7. [转]Maven如何手动添加jar包到本地Maven仓库

     Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项 ...

  8. Leetcode_217_Contains Duplicate

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46271159 Given an array of inte ...

  9. Objective-C的面向对象特性(一)

    Objective-C在c语言的基础上增加了面向对象特性,都有哪些面向对象特性呢? 其中第一个最重要的特性是类和对象的实现. Objective-C软件由许多对象构成,形成一个对象网络,对象之间通过发 ...

  10. iOS中动态计算不同颜色、字体的文字高度

    在改项目bug的时候,有一个问题动态计算label的高度,前开发者竟然用字符串长度除以14.16这样的常量来计算是否换行,结果cell的高度问题非常严重. 因为label内容里有部分关键字是要另一种颜 ...