杨老师课堂_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)咨询。

posted @ 2018-05-14 19:46  杨校  阅读(1848)  评论(0编辑  收藏  举报