【任务描述】
编写一个模拟记事本的程序,通过在控制台输入命令,实现在本地新建文件、打开文件和修改文件等功能。要求在程序中,用户输入指令 1 代表“新建文件”,此时可以从控制台获取用户输入的文件内容;指令 2 代表“打开文件”,此时可将指定路径的 txt 文件的内容展示到控制台;指令 3 代表“修改文件”,此时既可以修改新建文件的内容,也可以修改打开文件的内容;指令 4 代表“保存”,此时如果是新建的文件需要保存,则将文件保存到用户输入的路径,如果打开的文件需要保存,则将原来内容覆盖;指令 5 代表“退出”,即退出本系统。例如,输入指令 1 之后输入一些内容,再输入指令 4 和文件保存的路径,此时可将输入的内容保存至指定路径(此路径中的目录必须存在,否则会报错)。输入指令 2 之后输入想要查看的文件的路径,再输入指定 3 以及要修改的内容,再输入指令 4 ,此时完成了指定路径下的文件的修改。
【实现思路】
1、创建一个记事本类,在类中可以使用 while 循环实现控制台中操作指令的多次输入,使用 switch 语句根据控制台输入的操作台指令来判断执行什么操作。
2、输入指令 1 时继续新建文件操作,此时需要从控制台获取输入的内容并暂存到全局变量中,以便后期进行保存和修改内容时使用。可以使用 StringBuffer 来保存控制台中每次输入的内容,输入内容时可能会涉及换行,这里可以使用 while 循环来循环输入,每循环一次都将控制台的操作内容拼接换行符后,追加到文本内容中。当内容输入“stop”字符串时,输入文本内容的操作结束,并将新建文本的内容暂存在全局变量中。
3、执行指令 2 时,可以打开指定路径的文件,由于是模拟记事本程序,因此限定此功能只支持打开 txt 文件。此操作首先要获取输入的路径,判断此路径的文件是否是 txt 文件,如果是则通过字符流读取此文件,然后将此文件的内容打印至控制台,并且暂存在全局变量中,将文件的路径也保存至全局变量中。
4、执行指令 3 时,可以对暂存在全局变量中的文本内容进行修改,修改后的内容也需要暂存到全局变量中。 此操作首先要判断一下修改之前是否时经过新建文件或打开文件操作,当确认经过上述操作后,可以将输入的字符串与文本内容中目标字符串进行替换,来完成修改内容功能。修改过程可通过 while 循环来进行多次的修改,当捕捉到“stop”字符串时修改结束,并将修改后的内容暂存到全局变量中。
5、执行指令 4 时,将所有全局变量中的内容保存至本地,如果是新建的文件则保存至用户输入的路径,如果是打开后的文件则将原文件覆盖。可以通过文件路径的全局变量判断是哪种保存方式,当是打开文件的方式时,直接通过字符流写入;当是新建的方式时,先获取用户输入的路径,再用字符流写入。
6、执行指令 5,直接退出系统,可以通过代码“System.exit(0);”来实现。
【实现代码】
1、创建记事本类,在类中编写执行程序的 main 方法,如下所示。
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Scanner;
public class NotePad {
private static String filePath;
private static String message = "";
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
System.out.println("==1:新建文件 2:打开文件 3:修改文件 4:保存 5:退出==");
while (true) {
System.out.println("请输入指令");
int command = sc.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("您输入的指令有误!");
}
}
}
}
2、在 Notepad 中编写新建文件方法,如下所示。
/**
* 新建 从控制台获取内容
*/
private static void createFile() {
message = ""; //新建文件时,暂存文件清空
Scanner sc = new Scanner(System.in);
System.out.println("请输入内容,停止编写请输入\"stop\":");
StringBuffer stb = new StringBuffer(); //用于后期输入内容的拼接
String inputMessage = "";
while (!inputMessage.equals("stop")) { //当输入“stop”时,停止输入
inputMessage = sc.nextLine(); //获取输入信息
stb.append(inputMessage); //拼接输入信息
if (stb.length() > 0) {
stb.append("\r\n"); //追加换行符
}
}
message = stb.toString(); //将输入内容暂存
}
3、在 Notepad 中编写打开文件方法,如下所示。**
/**
* 打开文件
*/
private static void openFile() throws Exception{
message = ""; 打开文件时,将暂存的内容清空
Scanner sc = new Scanner(System.in);
System.out.println("请输入打开文件的位置:");
filePath = sc.next(); //获取打开文件的路径
//控制只能输入 txt 格式的文件路径
if (filePath != null && !filePath.endsWith(".txt")) {
System.out.println("请选择文本文件!");
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(); //释放资源
}
4、在 Notepad 中编写修改文件方法,如下所示。
/**
* 修改文件内容 通过字符串替换的形式
*/
private static void editFile() {
if (message == "" && filePath == null) {
System.out.println("请先新建文件或者打开文件");
return;
}
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的内容(以\"修改的目标文字:修改之后的文字\"格式)," + "停止修改请输入\"stop\":");
String inputMessage = "";
while (!inputMessage .equals("stop")) { //当输入 stop 时,停止修改
inputMessage = sc.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);
}
5、在 Notepad 中编写保存文件方法,如下所示。
/**
* 保存 新建文件存在用户输入的路径 打开的文件将原文件覆盖
*/
private static void saveFile() throws Exception{
Scanner sc = new Scanner(System.in);
FileWriter out = null;
if (filePath != null) { //文件是由“打开”载入的
out = new FileWriter(filePath); //将原文件覆盖
}else {
System.out.println("请输入文件保存的绝对路径:");
String path = sc.next(); //获取文件保存的路径
filePath = path;
//将输入路径中大写字母替换成小写字母后判断是不是文本格式
if (!filePath.toLowerCase().endsWith(".txt")) {
filePath += ".txt";
}
out = new FileWriter(filePath); //创建输出流
}
out.write(message); //写入暂存的内容
out.close(); //关闭输出流
message = ""; //修改文件前先将写入的内容置空
filePath = null; //将文件路径设置置空
}
6、编写退出程序方法,如下所示。
/**
* 退出
*/
private static void exit() {
System.out.println("您已退出系统,谢谢使用!");
System.exit(0);
}
这个案例中的个别方法只能在此案例中使用,如打开文件,只能打开由此案例创建的文件,如果打开非本案例创建的文件,控制台会出现乱码现象,经初步排查,原因是字符编码不匹配,windows 默认记事本的编码格式为 UTF-8,但 eclipse 默认的是 ANSI,强行打开可能会出现文本无法正确显示的情况。本人实力不足,无法解决此问题,希望日后能够早日解决。