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

(1) 用户输入指令1代表“新建日记本”,从控制台获取用户输入的日记内容。

(2) 指令2代表“打开日记本”,读取指定路径的txt文件的内容并输出到控制台。

(3) 指令3代表“修改日记本”,修改日记时,既可以修改新建日记本的内容,也可以修改已打开日记本的内容。

(4) 指令4代表“保存”,如果是新建的日记本需要保存,则将日记本保存到用户输入的路径;如果是打开的日记本需要保存,则将原来内容覆盖;

(5) 指令5代表“退出”,即退出本系统。

综合考验对于Java语言理解,while循环,if循环,swith选择,调用方法,创建新对象,输入输出语句,stringbuilder容器,try,catch捕捉异常,io流,file中的读和写,system的用法。同时程序无论怎样输入都不报错,在真实的场景中也可以避免用户的数据丢失。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import static java.lang.System.exit;
public class NO5 {
    //new一个Scanner,用static修饰后可被所有方法调用,提高代码的简洁性
    static Scanner in = new Scanner(System.in);
    //用StringBuilder当做容器来装字符串,在单线程在比StringBuffer更加快捷
    static StringBuilder stringBuilder1 = new StringBuilder();
    static StringBuilder stringBuilder2 = new StringBuilder();
    //定义一个str路径,被static修饰后可以被所有方法调用,提高代码的简洁性
    static String str;//打开的路径
    //定义open的打开状态,避免没有打开日记本的情况下修改日记本报错
    static int open_result = 0;
    //定义new的打开状态,避免没有新建日记本的情况下修改日记本报错
    static int new_result = 0;
    //主线程main方法中尽量减少代码,提高程序运行的速度
    public static void main(String[] args)  {
        while (true) {
            Menu1();
            try {
                Operate1();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    //循环菜单进行选择
    public static void Menu1() {
        System.out.println("南阳理工计软实验日记本系统");
        System.out.println("指令1代表“新建日记本”,为您输入的日记内容");
        System.out.println("指令2代表“打开日记本”,读取指定路径的txt文件的内容并输出到控制台");
        System.out.println("指令3代表“修改日记本”,修改日记时,既可以修改新建日记本的内容,也可以修改已打开日记本的内容");
        System.out.println("指令4代表“保存”,如果是新建的日记本需要保存,则将日记本保存到您输入的路径;如果是打开的日记本需要保存,则将原来内容覆盖 ");
        System.out.println("指令5代表“退出”,即退出本系统");
    }
    public static void Operate1() throws Exception {
        System.out.print("请输入您的指令:");
        int Operate1_ = in.nextInt();
        switch (Operate1_) {
            case 1 -> New();
            case 2 -> Open();
            case 3 -> Alter();
            case 4 -> Save();
            case 5 -> exit(0);
            default -> System.out.println("请输入正确的指令1-5");
        }
    }
    public static void New() {
        new_result++;
        System.out.print("请输入内容:");
        stringBuilder1 = new StringBuilder(in.next());
        System.out.println("您输入的内容为:" + stringBuilder1);
        System.out.println("新建成功");
    }
    public static void Open() throws Exception {
        open_result++;
        System.out.print("请输入路径:");
        System.out.println("1:绝对路径格式为(盘名(C,D)):/(文件夹名或者文件名.txt)");
        System.out.println("2:相对路径格式为,您输入的任意字符为文件名,文件位于IDEA的项目中,直接默认为.txt日记本格式");
        System.out.println("3:打开格式默认为utf-8");
        str = in.next();
        //用try,catch来捕捉到,输入的错误路径,避免程序崩溃
        FileReader reader = new FileReader(str);
        BufferedReader br = new BufferedReader(reader);
        String Open_;
        while ((Open_ = (br.readLine())) != null) {
            stringBuilder2.append(Open_);
            System.out.println(Open_);
        }
        br.close();
        System.out.println("打开成功");
    }
    public static void Alter() {
        System.out.println("(1)修改新建日记本的内容   (2)修改已经打开日记本的内容");
        System.out.print("请选择需要进行的操作:");
        int Alter_ = in.nextInt();
        switch (Alter_) {
            case 1 -> {
                if (new_result != 0) {
                    Alter1();
                }
                else System.out.println("您还没有新建任何一个日记本请先新建一个日记本再修改日记本");
            }
            case 2 -> {
                if (open_result != 0) {
                    Alter2();
                }
                else System.out.println("您还没有打开任何一个日记本请先打开日记本再修改日记本");
            }
            default -> System.out.println("请输入1-2");
        }
    }
    public static void Alter1()  {
        while (true) {
            Menu2();
            Operate2();
            break;
        }
    }
    public static void Menu2() {
        System.out.println("1:插入内容");
        System.out.println("2:指定内容删除");
        System.out.println("3:指定范围删除");
        System.out.println("4:修改范围内容");
    }
    public static void Operate2() {
        System.out.print("请输入您的指令:");
        int Operate2_ = in.nextInt();
        switch (Operate2_) {
            case 1 -> Alter1_Operate2_case1();
            case 2 -> Alter1_Operate2_case2();
            case 3 -> Alter1_Operate2_case3();
            case 4 -> Alter1_Operate2_case4();
            default -> System.out.println("请输入1-4");
        }
    }
    public static void Alter1_Operate2_case1(){
        try {
            System.out.println("您当前的新建日记本的内容为:" + stringBuilder1);
            System.out.print("请输入您要插入的内容:");
            String scanner1_Alter1_Operate2_case1_ = in.next();
            System.out.println("请输入您要插入的位置");
            System.out.println("一个字符占一个位置,第一个字符为第0个位置,第二个字符为第1个位置依次类推");
            int scanner2_Alter1_Operate2_case1 = in.nextInt();
            System.out.println("插入" + scanner1_Alter1_Operate2_case1_ + "在第" + scanner2_Alter1_Operate2_case1 + "个位置");
            stringBuilder1.insert(scanner2_Alter1_Operate2_case1, scanner1_Alter1_Operate2_case1_);
            System.out.println("您修改后的新建日记本为:" + stringBuilder1);
        } catch (Exception e) {
            System.out.println("您要插入的位置可能不存在请重试");
        }
    }
    public static void Alter1_Operate2_case2()  {
        try {
            System.out.println("您当前的新建日记本的内容为:" + stringBuilder1);
            System.out.print("请输入您要删除的内容的位置:");
            System.out.println("一个字符占一个位置,第一个字符为第0个位置,第二个字符为第1个位置依次类推");
            int scanner1_Alter1_Operate2_case2 = in.nextInt();
            stringBuilder1.deleteCharAt(scanner1_Alter1_Operate2_case2);
            System.out.println("您删除后的新建日记本内容为" + stringBuilder1);
        } catch (Exception e) {
            System.out.println("您要删除的位置可能不存在请重试");
        }
    }
    public static void Alter1_Operate2_case3() {
        try {
            System.out.println("您当前的新建日记本的内容为:" + stringBuilder1);
            System.out.println("请输入您要指定范围的起始值");
            int Alter1_Operate2_case3_1 = in.nextInt();
            System.out.println("请输入您要指定范围的最终值");
            int Alter1_Operate2_case3_2 = in.nextInt();
            stringBuilder1.delete(Alter1_Operate2_case3_1, Alter1_Operate2_case3_2);
            System.out.println("您删除后的新建日记本内容为" + stringBuilder1);
        } catch (Exception e) {
            System.out.println("您删除的范围可能不存在或者超出了界限请重试");
        }
    }
    public static void Alter1_Operate2_case4()  {

        try {
            System.out.println("请输入您要替换的内容");
            String Alter1_Operate2_case4_1 = in.next();
            System.out.println("请输入您要修改范围的起始位置值");
            int Alter1_Operate2_case4_2 = in.nextInt();
            System.out.println("请输入您要修改范围的最终位置值");
            int Alter1_Operate2_case4_3 = in.nextInt();
            stringBuilder1.replace(Alter1_Operate2_case4_2, Alter1_Operate2_case4_3, Alter1_Operate2_case4_1);
            System.out.println("您修改后的新建日记本内容为" + stringBuilder1);
        } catch (Exception e) {
            System.out.println("您修改的范围可能不存在或者超出了的界限请重试");
        }
    }
    public static void Alter2() {
        while (true) {
            Menu3();
            Operate3();
            break;
        }
    }
    public static void Menu3() {
        System.out.println("1:插入内容");
        System.out.println("2:指定内容删除");
        System.out.println("3:指定范围删除");
        System.out.println("4:替换内容");
    }
    public static void Operate3()  {
        System.out.print("请输入您的指令:");
        int Operate3_ = in.nextInt();
        switch (Operate3_) {
            case 1 -> Alter2_Operate3_case1();
            case 2 -> Alter2_Operate3_case2();
            case 3 -> Alter2_Operate2_case3();
            case 4 -> Alter2_Operate2_case4();
            case 5 -> System.out.println("请输入1-5");
        }
    }
    private static void Alter2_Operate3_case1(){
        try {
            System.out.println("您当前的打开日记本的内容为:" + stringBuilder2);
            System.out.print("请输入您要插入的内容:");
            String scanner1_Alter2_Operate3_case1 = in.next();
            System.out.println("请输入您要插入的位置");
            System.out.println("一个字符占一个位置,第一个字符为第0个位置,第二个字符为第1个位置依次类推");
            int scanner2_Alter2_Operate3_case1 = in.nextInt();
            System.out.println("插入" + scanner1_Alter2_Operate3_case1 + "在第" + scanner2_Alter2_Operate3_case1 + "个位置");
            stringBuilder2.insert(scanner2_Alter2_Operate3_case1, scanner1_Alter2_Operate3_case1);
            System.out.println("您修改后的打开日记本为" + stringBuilder2);
        } catch (Exception e) {
            System.out.println("您插入的位置可能不存在请重试");
        }
    }
    private static void Alter2_Operate3_case2()  {
        try {
            System.out.println("您当前的打开日记本的内容为:" + stringBuilder2);
            System.out.print("请输入您要删除的内容的位置:");
            System.out.println("一个字符占一个位置,第一个字符为第0个位置,第二个字符为第1个位置依次类推");
            int scanner1_Alter2_Operate3_case2 = in.nextInt();
            stringBuilder2.deleteCharAt(scanner1_Alter2_Operate3_case2);
            System.out.println("您删除后的新建日记本内容为" + stringBuilder2);
        } catch (Exception e) {
            System.out.println("您要删除的位置可能不存在请重试");
        }
    }
    public static void Alter2_Operate2_case3()  {

        try {
            System.out.println("您当前的新建日记本的内容为:" + stringBuilder2);
            System.out.println("请输入您要指定范围的起始值");
            int Alter2_Operate2_case3_1 = in.nextInt();
            System.out.println("请输入您要指定范围的最终值");
            int Alter2_Operate2_case3_2 = in.nextInt();
            stringBuilder2.delete(Alter2_Operate2_case3_1, Alter2_Operate2_case3_2);
            System.out.println("您删除后的新建日记本内容为" + stringBuilder2);
        } catch (Exception e) {
            System.out.println("您要删除的位置可能不存在或者超出了界限请重试");
        }
    }
    public static void Alter2_Operate2_case4() {
        try {
            System.out.println("请输入您要替换的内容");
            String Alter2_Operate2_case4_1 = in.next();
            System.out.println("请输入您要修改范围的起始位置值");
            int Alter2_Operate2_case4_2 = in.nextInt();
            System.out.println("请输入您要修改范围的最终位置值");
            int Alter2_Operate2_case4_3 = in.nextInt();
            stringBuilder1.replace(Alter2_Operate2_case4_2, Alter2_Operate2_case4_3, Alter2_Operate2_case4_1);
        } catch (Exception e) {
            System.out.println("您要修改的位置可能不存在或者超出的界限请重试");
        }
    }
    public static void Save() throws Exception {
        System.out.println("(1)保存新建的日记本  (2)保存打开的日记本");
        System.out.print("请选择需要进行的操作:");
        int Save_ = in.nextInt();
        switch (Save_) {
            case 1 -> {
                if (new_result != 0) {
                    Save1();
                }
                else System.out.println("您还没有新建任何一个日记本,无法保存");
            }
            case 2 -> {
                if (open_result != 0) {
                    Save2();
                }
                else System.out.println("您还没有打开任何一个日记本,无法保存");
            }
            case 3 -> System.out.println("请输入1-2");
        }
    }
    public static void Save1() throws IOException {
        System.out.print("请输入路径:");
        System.out.println("1:绝对路径格式为(盘名(C,D)):/(文件夹名或者文件名.txt)");
        System.out.println("2:相对路径格式为,您输入的任意字符为文件名,文件位于IDEA的项目中,直接默认为.txt日记本格式");
        String Save1_;
        Save1_ = in.next();
        FileWriter file = new FileWriter(Save1_);
        file.write(String.valueOf(stringBuilder1));
        file.write("\n");
        file.close();
        stringBuilder1 = null;
        System.out.println("保存成功");
    }
    public static void Save2() throws IOException {
        FileWriter writer = new FileWriter(str);
        writer.write(String.valueOf(stringBuilder2));
        writer.write("\n");
        writer.close();
        stringBuilder2 = null;
        System.out.println("保存成功");
    }
}

1:使用while循环语句来实现重复的菜单,switch的使用,break的使用,Scanner的使用,

2:方法的调用,递归

3:try,catch捕获异常,throws抛出异常

4:io流,读数据,filereader,buffereader,while的固定格式使用,writer的使用,(.close)关闭

5:用StringBuilder当做容器来装字符串,在单线程在比StringBuffer更加快捷,Stringbuilder方法的使用