杨老师课堂_Java核心技术下之控制台模拟记事本案例

简介: 预览效果图:背景介绍:编写一个模拟记事本的程序通过在控制台输入指令,实现在本地新建文件打开文件和修改文件等功能。要求在程序中:  用户输入指令1代表“新建文件”,此时可以从控制台获取用户输入的文件内容;  指令2代表打开文件,此时可将指定路径的txt文件的内容展现到控制台,  指令3代...

预览效果图:

背景介绍:

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

要求在程序中:

  用户输入指令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)咨询。

目录
相关文章
|
4天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
32 11
|
14天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
50 7
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
1月前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
45 1
|
1月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
71 3
|
1月前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
34 7
|
1月前
|
移动开发 前端开发 Java
过时的Java技术盘点:避免在这些领域浪费时间
【10月更文挑战第14天】 在快速发展的Java生态系统中,新技术层出不穷,而一些旧技术则逐渐被淘汰。对于Java开发者来说,了解哪些技术已经过时是至关重要的,这可以帮助他们避免在这些领域浪费时间,并将精力集中在更有前景的技术上。本文将盘点一些已经或即将被淘汰的Java技术,为开发者提供指导。
108 7
|
1月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
53 3
|
1月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
62 2