楊老師課堂_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)咨詢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM