importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.Scanner;importorg.junit.Test;/*** Date:2018-05-14
*@authorMryang

* 思路分析:

1. 根据任务介绍和运行结果分析可知,此任务需要创建一个记事本类,

在类中可以使用while循环实现控制台中操作指令的多次输入,

使用switch语句根据控制台输入的操作指令来判断执行什么操作。

2. 输入指令1时进行新建文件操作,此时需要从控制台获取输入内容,并暂存到全局变量中,

以便后期进行保存和修改内容时使用,可以使用StringBuffer来保存控台中的每次输入的内容,

输入内容是可能会涉及换行,这里使用while循环来循环输入,

每循环一次可以将控制台获取的内容进行拼接换行符后,追加到文本内容中,

当内容中输入“stop”字符串时,需要文本内容的操作结束,并将新建文本的内容暂存在全局变量中。

3.执行指令2时可以打开指定路径的文件,由于是模拟记事本程序,

因此限定词功能只可以打开txt文件,此操作首先要获取输入的路径,判断此路径的文件是否是txt文件,

如果是则通过字符流读取此文件,然后将此文件的内容打印到控制台,并且暂存在全局变量中,将文件的路径也保存在全局变量中。

4. 执行指令3时,可以对暂存在全局变量中的文本内容进行修改,

修改后的内容也需要暂存到全局变量中,此操作首先要判断一下修改之前是否先经过新建文件或者打开文件操作,

当确认经过上述操作后,可以将输入的字符串与文本内容中目标字符串进行替换,来完成修改内容功能。

修改过程中,可以通过while循环来进行多次修改,

当捕捉到“stop”字符串时,修改结束并将修改后的内容暂存到全局变量中。

5. 执行指令4时,将所有全局变量中的内容保存到本地,如果是新建的文件则保存到用户输入的路径,

如果是打开后的文件,则将原文件覆盖,可以通过文件路径的全局变量判断是哪种保存方式。

当是打开文件的方式是直接通过字符流写入,当是新建的文件是先获取用户输入的路径,再用字符流写入

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

public classNotepad {privateString filePath;privateString message;
@Testpublic void notepadTest() throwsException {
Scanner scanner= newScanner(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 voidexit() {
System.out.println("您已经退出系统");
System.exit(0);
}/*** 修改文件: 通过字符串替换的形式*/
private voideditFile() {if (message == "" && filePath == null) {
System.out.println("请先新建文件或者打开文件");return;
}
Scanner scan= newScanner(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);
}/*** 打开文件
*@throwsException*/
private void openFile() throwsException {
message= "";
Scanner scan= newScanner(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= newStringBuffer();//循环读取 一次读取一个字符数组
while ((len = in.read(charArray)) != -1) {
sb.append(charArray);
}
message=sb.toString();
System.out.println("打开文件内容:" + "\r\n" +message);
in.close();
}/*** 新建文件:从控制台中获取文件*/
private voidcreateFile() {
message= "";//新建文件时,暂存的文件清空
Scanner scanner = newScanner(System.in);
System.out.println("请输入内容,停止请输入stop :");
StringBuffer stringBuffer= newStringBuffer();
String inputMessage= "";//用于存储客户输入的数据
while (!inputMessage.equals("stop")) {//当输入stop时。停止输入
if (stringBuffer.length()>0) {//如果有内容
stringBuffer.append("\r\n");//追加换行符
}
stringBuffer.append(inputMessage);//拼接输入的信息
inputMessage=scanner.nextLine();
}
message=stringBuffer.toString();
}/*** 保存文件
*@throwsIOException*/
private void saveFile() throwsIOException {
Scanner scan= newScanner(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;//将文件路径置空
}
}