命令行工具

程序解析

该工具实现了基本的6种文件操作
主方法:运行后,创建一个CommondTool的对象,调用start()方法

ICommod接口(6种操作)

    public boolean list();//列出一个目录下的所有文件和其大小
    public boolean mkdir(String path);//创建一个目录
    public boolean copy(String scr,String des);//将一个文件复制到另一个文件
    public boolean remove(String path);//删除一个文件
    public boolean cd_to_child(String path);//进入子目录
    public boolean cd_to_parent();//返回上一个目录

ICmd接口

定义6种指令
并创建一个数组保存

    //定义指令
    String LS = "ls";
    String MKDIR = "mkdir";
    String COPY = "copy";
    String RMDIR = "rmdir";
    String CD = "cd";
    String CDP = "cd..";
    //保存所有的指令
    String[] Commonds = new String[]{LS,MKDIR,COPY,RMDIR,CD,CDP};

CommondTool类

首先实现接口ICommond,接口包含6种方法分别对应6种操作,6种方法如上
定义一个字符作为初始目录位置
比如我的桌面
再定义一个字符作为当前所在目录位置
方便6种方法的操作
构建方法实现对当前目录的赋值,将初始位置给它

start方法的构建
用户输入指令后,进行读取,我们创建一个类CommondOperation进行相关操作
它的对象命名为operation

6种方法的构建
通常需要地址参数
参数通过监听者回调CommondOeration中方法读取的数据(指令,文件地址等)来进行具体的实现

    //默认目录
    private static final String DESKTOP_PATH = "C:/Users/cs/Desktop";
    //当前目录
    private StringBuilder Current_Path = null;
    
    public CommondTool(){
        Current_Path = new StringBuilder(DESKTOP_PATH);
    }
    
    //启动工具
    public void start(){
        //创建读取指令的对象
        CommondOperation operation = new CommondOperation();
        
        System.out.println("欢迎使用该命令行工具");
        while(true){
            showParent();//显示前一个路径
            
            try {
                operation.readCommond(this);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                System.out.println(e.getMessage());
            }
        }
        
    }
    private void showParent(){
        //获取最后一个
        int start = Current_Path.lastIndexOf("/");
        String parent = Current_Path.substring(start);
        parent += "#";
        System.out.print(parent);
    }

    @Override
    public boolean list() {
        // TODO Auto-generated method stub
        File[] files = FileManager.getInstance().list(Current_Path.toString());
        for(File file : files){
            String name = file.getName();//获取文件名
            long size = file.length();//获取文件长度
            long kb = size/1024;
            long by = size % 1024;
            System.out.print(name);
            for(int i = 0;i < 40 - name.length();i ++){//保持文件大小在同一列,中英文混合则无效
                System.out.print(" ");
            }
            System.out.println(kb + "." + by + "kb");
        }
        return false;
    }

    @Override
    public boolean mkdir(String path) {
        // TODO Auto-generated method stub
        String Dir_Path = Current_Path + "/" + path;
        FileManager.getInstance().mkdir(Dir_Path);
        System.out.println("创建成功");
        return false;
    }

    @Override
    public boolean copy(String src, String des) {
        // TODO Auto-generated method stub
        String Src_Path = Current_Path + "/" + src;
        String Des_Path = Current_Path + "/" + des;
        FileManager.getInstance().copy(Src_Path, Des_Path);
        
        return false;
    }

    @Override
    public boolean remove(String path) {
        // TODO Auto-generated method stub
        String Dir_Path = Current_Path + "/" + path;
        FileManager.getInstance().remove(Dir_Path);
        System.out.println("删除成功");
        return false;
    }

    @Override
    public boolean cd_to_child(String path) {
        // TODO Auto-generated method stub
        Current_Path.append("/");
        Current_Path.append(path);
        System.out.println("进入子目录"+Current_Path);
        return false;
    }

    @Override
    public boolean cd_to_parent() {
        // TODO Auto-generated method stub
        int start = Current_Path.lastIndexOf("/");
        int end = Current_Path.length();
        Current_Path.delete(start,end);
        return false;
    }

CommondOperation类

首先定义一个字符串列表List和Scanner对象,不进行赋值
在构建方法中对它们赋值,其中列表赋值为ICmd的指令数组,以便使用List的方法判断指令是否存在

定义一个监听者listener
private ICommond listener;
只要实现了ICommond接口的类都能作为监听者(比如CommondTool)

定义读取指令方法readCommond,给予参数ICommond listener作为监听者,使用this.listener = listener来接收监听者
所以,在CommondTool中start方法里,创建完CommondOperation对象后,调用方法readCommond(this),将自己作为监听者传递过去

然后解析指令获得具体的指令和文件地址
再根据具体指令使用监听者listener(CommondTool)的6种方法,参数已经解析出来
6种方法具体的实现在CommondTool中实现

    private List<String> commonds;
    //获取输入信息
    private Scanner mScanner;
    public CommondOperation(){
        mScanner = new Scanner(System.in);
        //将普通的Array类型转化为list类型
        commonds = Arrays.asList(ICmd.Commonds);
    }
    //回调对象
    private ICommond listener;
    //接收读取指令
    public void readCommond(ICommond listener) throws CommondNotExistException, CommondArgumentErrorException{
        this.listener = listener;
        //接收指令
        String commond = mScanner.nextLine();
        //解析指令
        parseCommond(commond);
    }
    public void parseCommond(String commond) throws CommondNotExistException, CommondArgumentErrorException{
        //将指令以空格做分割符分开
        String[] componts = commond.split(" ");
        
        //获取指令
        String cmd = componts[0];
        
        //判断指令是否存在
        if(!commonds.contains(cmd)){
            //不存在
            throw new IException.CommondNotExistException("指令不存在");
        }
        
        //存在
        //cd
        if(cmd.equals(ICmd.CD)){
            if(componts.length != 2){
                throw new IException.CommondArgumentErrorException("cd参数错误");
            }
            listener.cd_to_child(componts[1]);
        }
        //cd..
        if(cmd.equals(ICmd.CDP)){
            if(componts.length != 1){
                throw new IException.CommondArgumentErrorException("cd..无需参数");
            }
            listener.cd_to_parent();
        }
        //mkdir
        if(cmd.equals(ICmd.MKDIR)){
            if(componts.length != 2){
                throw new IException.CommondArgumentErrorException("mkdir参数错误");
            }
            listener.mkdir(componts[1]);
        }
        //rm file
        if(cmd.equals(ICmd.RMDIR)){
            if(componts.length != 2){
                throw new IException.CommondArgumentErrorException("rmdir参数错误");
            }
            listener.remove(componts[1]);
        }
        //ls
        if(cmd.equals(ICmd.LS)){
            if(componts.length != 1){
                throw new IException.CommondArgumentErrorException("ls无需参数");
            }
            listener.list();
        }
        //copy
        if(cmd.equals(ICmd.COPY)){
            if(componts.length != 3){
                throw new IException.CommondArgumentErrorException("copy参数错误");
            }
            listener.copy(componts[1],componts[2]);
        }
    }

FileManager类

为了代码的封装性以及代码的可读性
将大部分对于文件的操作方法写在该类里
供CommonTool调用

    private static FileManager manager;
    
    private FileManager(){};
    
    public static FileManager getInstance(){
        if(manager == null){
            synchronized(FileManager.class){
                if(manager == null){
                    manager = new FileManager();
                }
            }
        }
        return manager;
    }
    public boolean mkdir(String path){
        File file = new File(path);
        if(file.exists()){
            return false;
        }
        return file.mkdir();//若前几级目录不存在,则不执行;使用mkdirs()可以创建路径上所有不存在的目录
    }
    
    public boolean remove(String path){
        File file = new File(path);
        if(!file.exists()){
            return false;
        }
        return file.delete();
    }
    
    public File[] list(String path){
        File file = new File(path);
        if(!file.exists()){
            return null;
        }
        return file.listFiles(new FilenameFilter(){

            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                if(name.endsWith("txt")){//自己选择过滤条件,这里是只要文本文件
                    return true;
                }
                return false;
            }
            
        });
    }
    public boolean copy(String src,String des){//拷贝
        File file1 = new File(src);
        File file2 = new File(des);
        if(!file1.exists()){//不存在
            System.out.println("文件不存在");
            return false;
        }else if(file1.isFile() && !file2.isDirectory()){//是文件
            copyFile(src,des);
            System.out.println("复制成功");
        }else if(file1.isDirectory() && !file2.isFile()){//是目录
            copyDir(src,des);
            System.out.println("复制成功");
        }else{
            System.out.println("复制出错");
        }
        
        return false;
    }
    private boolean copyFile(String src,String des){
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try{
            //创建输入输出流
            fis = new FileInputStream(src);
            bis = new BufferedInputStream(fis);
            fos = new FileOutputStream(des);
            bos = new BufferedOutputStream(fos);
            //创建buffer
            byte[] buffer = new byte[1024];
            int len = 0;
            while((len = bis.read(buffer)) != -1){
                bos.write(buffer);
                System.out.println("请稍等...");
                }
            bos.flush();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try {
                bis.close();
                fis.close();
                bos.close();
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return true;
    }
    private void copyDir(String src,String des){
        File file1 = new File(src);
        File file2 = new File(des);
        file2.mkdir();
        for(File file : file1.listFiles()){
            copyFile(file.getAbsolutePath(),des+"/"+file.getName());
        }
    }

IException类(自己定义的异常)

包括指令未找到,指令给的参数不符合等,提示内容按照实际情况来写

    static class CommondNotExistException extends Exception{
        public CommondNotExistException(String s){
            super(s);
        }
    }
    static class CommondArgumentErrorException extends Exception{
        public CommondArgumentErrorException(String s){
            super(s);
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348