兄弟们!!!(命令行参数) 它又来了!! 2020-04-14

命令行参数项目实战

1.功能描述

①在终端输入ls,会列出所有文件。并在后面跟上它的大小。比如
Applications 2M
②终端输入mkdir temp就会创建一个temp目录
③终端输入createNewFile temp就会创建一个temp文件
cope 1.txt 2.txt就是在当前文件夹下复制1.txt到当前文件夹下,并命名为2.txt。这是文件,当然也有可能是拷贝文件夹,在拷贝文件夹的时候,要把里面所有文件都拷贝过去
delete 1.txt就是删除文件1.txt

2.初试

1.遇到的问题

在第一次写的时候,遇到了很多问题

1.1如何接收整行数据

当时我只知道直接用scanner.next()的话,空格或者换行符之后的数据就接收不到了,而功能描述里面,比如mkdir temp,mkdir和temp之间是有空格的,那temp这个数据怎么接收呢?当时也是查了好久,问了好久,才找到了解决办法
①使用.nextLine();,这样会接收一整行数据,当然包括空格之后的。
②接收一整行数据之后,调用String的split(" ")方法,把这一整行数据通过空格分成若干部分,并用字符串数组接收。具体使用示例如下

        //接收命令
        Scanner scanner = new Scanner(System.in);
        String command = scanner.nextLine();
        
        //把输入字符串通过空格隔开
        String[] everyName = command.split(" ");

1.2如何列出文件名及大小

当时尝试了很多方法,先想出了第一种解决办法,就是用file.list()方法,并用字符串数组接收,然后一个一个输出名字和用.length()方法得出文件大小。但是今早我才意识到这是不对的。file.list()返回值是String数组,得到的文件或目录名确实是对的,但是用length()方法得出来的不是文件的大小,而是字符串长度。 今早我改过来了,应该
①使用.listFile()方法,返回文件数组,。
②再用每一个文件相应的方法输出姓名和文件大小。具体使用示例如下

       //2.保存所有文件名
       File[] allFiles = file.listFiles();//注意这里返回的是数组String[]而不是String。
       
       //3.输出文件名(记住要用for循环,不能直接System.out.println(allFiles),这样会直接输出内存地址(没有重写toString)
       for(File oneFile:allFiles) {
          System.out.print(oneFile.getName());
          
          //double sizeofFile = oneFile.length()/1024;//由于桌面上的文件都很小,所以这里就不需要进行转换了
          System.out.println("的大小为"+oneFile.length()+"B");
       }

这样输出的结果就类似于

输出结果

1.3如何复制目录

文件复制较为容易,但是目录就不一样了。
我想到的解决办法就是
先把文件复制方法写出来
②利用增强for循环,把待复制目录的文件一个一个地取出
③分别把每一个取出的文件进行复制。
大概如下

 String[] fileNames = srcFile.list();
                    
 for(String oneFile:fileNames) {
 }

1.4文件对象的输出

比如oneFile是一个File类型的对象,然后直接输出它,和输出oneFile.getAbsolutePath()得到的结果是一样的。都是文件地址。输出结果类似C:\Users\刘金豪\Desktop.vs。究其原因,应该是没有重写toString方法。

2.初试成果

①Main类

package filetest;

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        
        //接收命令
        Scanner scanner = new Scanner(System.in);
        String command = scanner.nextLine();
        
        //把输入字符串通过空格隔开
        String[] everyName = command.split(" ");
        
        //创建路径
        String src = "C:\\Users\\刘金豪\\Desktop";
        String des = "C:\\Users\\刘金豪\\Desktop\\copy";
        
        //匹配功能
        //输出所有文件
        if(everyName[0].equals("ls")) {
          listAll.show(src);        
        }
        
        //创建目录
        if(everyName[0].equals("mkdir")) {
            //1.保存目录名
            String dirName = everyName[1];
            //2.创建目录
            File file = new File(src+"\\"+dirName);//注意这里是src而不是“src”
            if(!file.exists()) {
                try{
                    file.mkdir();
                }catch(Exception e) {
                    e.printStackTrace();
                }
                System.out.println("创建成功");
            }
        }
        
        //创建文件
        if(everyName[0].equals("createNewFile")) {
            //1.保存文件名
            String fileName = everyName[1];
            //2.创建文件
            File file = new File(src+"\\"+fileName);
            if(!file.exists()) {
                try {
                    file.createNewFile();
                }catch(Exception e) {
                    e.printStackTrace();
                }
                System.out.println("创建成功");
            }
        }
        
        //copy文件
        if(everyName[0].equals("copy")) {
            //1.保存文件名称
            String src_file = everyName[1];
            String des_file = everyName[2];
            
            //2.保存文件路径名
            String srcF = src+"\\"+src_file;
            String desF = des;//+"\\"+des_file;
            
            //2.创建文件
            File srcFile = new File(srcF);

            
            if(srcFile.exists()) {
                //如果是文件,则执行这个
                if(srcFile.isFile()) {
                    while(true) {
                        //判断是字节流还是字符流
                        System.out.println("请选择字节流或字符流(分别输入1/2)");
                        Scanner scanner1 = new Scanner(System.in);
                        int byte_or_char = scanner.nextInt();
                        
                        if(1 == byte_or_char) {
                            copyFile.copyByte(srcF, desF);
                            break;
                        }if(2 == byte_or_char) {
                            copyFile.copyChar(srcF, desF);
                            break;
                        }else {
                            System.out.println("输入有误,请重新输入");
                            continue;
                        }
                        
                    }
                }else {
                    
                    String[] fileNames = srcFile.list();
                    
                    for(String oneFile:fileNames) {
                        System.out.println("当前文件名为"+oneFile);
                        while(true) {
                            //判断是字节流还是字符流
                            System.out.println("请选择字节流或字符流(分别输入1/2)");
                            Scanner scanner1 = new Scanner(System.in);
                            int byte_or_char = scanner.nextInt();
                            
                            if(1 == byte_or_char) {
                                copyFile.copyByte(srcF+"\\"+oneFile, desF+"\\"+oneFile);
                                break;
                            }if(2 == byte_or_char) {
                                copyFile.copyChar(srcF+"\\"+oneFile, desF+"\\"+oneFile);
                                break;
                            }else {
                                System.out.println("输入有误,请重新输入");
                                continue;
                            }
                            
                        }
                    }
                    
                }
                
                
                
            }
            
        }
        
        //删除文件
        if(everyName[0].equals("delete")) {
            //保存待删除的文件名
            String deFileName = everyName[1];
            //创建file
            File file = new File(src+"//"+deFileName);
            if(file.exists()) {
                try {
                    file.delete();
                }catch(Exception e) {
                    e.printStackTrace();
                }
                System.out.println("删除成功");
            }
        }
    }
}

②listAll类

package filetest;

import java.io.File;

//列出所有文件夹
public class listAll {
   public static void show(String src) {
       //1.创建文件
       File file = new File(src);       
       
       //2.保存所有文件名
       File[] allFiles = file.listFiles();//注意这里返回的是数组String[]而不是String。
       
       //3.输出文件名(记住要用for循环,不能直接System.out.println(allFiles),这样会直接输出内存地址(没有重写toString)
       for(File oneFile:allFiles) {
          System.out.print(oneFile.getName());
          
          //double sizeofFile = oneFile.length()/1024;//由于桌面上的文件都很小,所以这里就不需要进行转换了
          System.out.println("的大小为"+oneFile.length()+"B");
       }
       //下面这种会输出类似C:\Users\刘金豪\Desktop\.vs的大小为4096B,是直接输出路径了,我们不需要这种形式,就选择上面那种
      /* //2.保存该目录下的所有文件
       File[] files = file.listFiles();
       
       //3.逐一输出文件名及大小
       for(File oneFile:files) {
           System.out.println(oneFile+"的大小为"+oneFile.length()+"B");
           //System.out.println(oneFile.getAbsolutePath());//与上面一行代码是一样的,除了后面加的文字叙述“的大小为”后面的。
           //也就是说直接输出oneFile和输出oneFile.getAbsolutePath()的结果是一样的。
       }*/
   }
}

copyFile类

package filetest;

import java.io.*;

//拷贝文件
public class copyFile {

    public static void copyByte(String srcF,String desF) {
        try(    FileInputStream fis = new FileInputStream(srcF);
                FileOutputStream fos = new FileOutputStream(desF);) {
            
            int len = 0;
            byte[] bytes = new byte[1024];//这一行代码当时不会写了
            if((len = fis.read()) != -1) {
                fis.read(bytes);
                
                //写入数据
                fos.write(bytes);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("复制成功!");
    }
    
    public static void copyChar(String srcF,String desF) {
        try(    FileReader fis = new FileReader(srcF);
                FileWriter fos = new FileWriter(desF);) {
            
            int len = 0;
            char[] chars = new char[1024];//这一行代码当时不会写了
            if((len = fis.read()) != -1) {
                fis.read(chars);
                
                //写入数据
                fos.write(chars);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("复制成功!");
    }
}

三.卷土重来

上面的代码是第一次写完之后的,但是仔细观察,上面的代码结构不行,过程也不是很清晰,总之还是太受c语言的束缚,所以在今早我又改了一下,以更加熟悉“面向对象”的思想

1.项目层级

项目层级

名称对应的功能都显而易见了

2.具体代码

①Main类

package filetest;

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        
        //接收命令
        Scanner scanner = new Scanner(System.in);
        String command = scanner.nextLine();
        
        //把输入字符串通过空格隔开(这个是当时没想到的,后来通过反复查询才找到这个知识点。
        String[] everyName = command.split(" ");
        
        //创建路径
        String src = "C:\\Users\\刘金豪\\Desktop";
        String des = "C:\\Users\\刘金豪\\Desktop\\copy";
        
        //匹配功能
        matchFunction.mFunction(src,des,everyName);
    
    }
}

②matchFunction类

package filetest;

public class matchFunction {
    public static void mFunction(String src,String des,String[] everyName) {
        //匹配功能
        //输出所有文件
        if(everyName[0].equals("ls")) {
          listAll.show(src);        
        }
        
        //创建目录
        if(everyName[0].equals("mkdir")) {
          mkdir.mkDirectory(src,everyName[1]);
        }
        
        //创建文件
        if(everyName[0].equals("createNewFile")) {
          createFile.cFile(src, everyName[1]);
        }
        
        //copy文件
        if(everyName[0].equals("copy")) {
          copyFile.copy(src, des, everyName[1], everyName[2]);
        }
        
        //删除文件
        if(everyName[0].equals("delete")) {
            deleteFile.deFile(src, everyName[1]);
        }
    }
}

③listAll类

package filetest;

import java.io.File;

//列出所有文件夹
public class listAll {
   public static void show(String src) {
       //1.创建文件
       File file = new File(src);       
       
       //2.保存所有文件名
       File[] allFiles = file.listFiles();//注意这里返回的是数组String[]而不是String。
       
       //3.输出文件名(记住要用for循环,不能直接System.out.println(allFiles),这样会直接输出内存地址(没有重写toString)
       for(File oneFile:allFiles) {
          System.out.print(oneFile.getName());
          
          //double sizeofFile = oneFile.length()/1024;//由于桌面上的文件都很小,所以这里就不需要进行转换了
          System.out.println("的大小为"+oneFile.length()+"B");
       }
       //下面这种会输出类似C:\Users\刘金豪\Desktop\.vs的大小为4096B,是直接输出路径了,我们不需要这种形式,就选择上面那种
      /* //2.保存该目录下的所有文件
       File[] files = file.listFiles();
       
       //3.逐一输出文件名及大小
       for(File oneFile:files) {
           System.out.println(oneFile+"的大小为"+oneFile.length()+"B");
           //System.out.println(oneFile.getAbsolutePath());//与上面一行代码是一样的,除了后面加的文字叙述“的大小为”后面的。
           //也就是说直接输出oneFile和输出oneFile.getAbsolutePath()的结果是一样的。
       }*/
   }
}

④mkdir类

package filetest;

import java.io.File;

//创建目录
public class mkdir {

    public static void mkDirectory(String src,String dirName) {

            //创建目录
            File file = new File(src+"\\"+dirName);//注意这里是src而不是“src”
            if(!file.exists()) {
                try{
                    file.mkdir();
                }catch(Exception e) {
                    e.printStackTrace();
                }
                System.out.println("创建成功");
            }
    }
}

⑤createFile类

package filetest;

import java.io.File;

public class createFile {
    public static void cFile(String src,String fileName) {
        //创建文件
        File file = new File(src+"\\"+fileName);
        if(!file.exists()) {
            try {
                file.createNewFile();
            }catch(Exception e) {
                e.printStackTrace();
            }
            System.out.println("创建成功");
        }
    }
}

⑥copyFile类

package filetest;

import java.io.*;
import java.util.Scanner;

//拷贝文件
public class copyFile {

    public static void copy(String src,String des,String src_file,String des_file) {
        
        //保存文件路径名
        String srcF = src+"\\"+src_file;
        String desF = des;//+"\\"+des_file;
        
        //创建文件
        File srcFile = new File(srcF);

        
        if(srcFile.exists()) {
            //如果是文件,则执行这个
            if(srcFile.isFile()) {
                while(true) {
                    //判断是字节流还是字符流
                    System.out.println("请选择字节流或字符流(分别输入1/2)");
                    Scanner scanner1 = new Scanner(System.in);
                    int byte_or_char = scanner1.nextInt();
                    
                    if(1 == byte_or_char) {
                        copyFile.copyByte(srcF, desF);
                        break;
                    }if(2 == byte_or_char) {
                        copyFile.copyChar(srcF, desF);
                        break;
                    }else {
                        System.out.println("输入有误,请重新输入");
                        continue;
                    }
                    
                }
            }else {
                
                String[] fileNames = srcFile.list();
                
                for(String oneFile:fileNames) {
                    System.out.println("当前文件名为"+oneFile);
                    while(true) {
                        //判断是字节流还是字符流
                        System.out.println("请选择字节流或字符流(分别输入1/2)");
                        Scanner scanner1 = new Scanner(System.in);
                        int byte_or_char = scanner1.nextInt();
                        
                        if(1 == byte_or_char) {
                            copyFile.copyByte(srcF+"\\"+oneFile, desF+"\\"+oneFile);
                            break;
                        }if(2 == byte_or_char) {
                            copyFile.copyChar(srcF+"\\"+oneFile, desF+"\\"+oneFile);
                            break;
                        }else {
                            System.out.println("输入有误,请重新输入");
                            continue;
                        }
                        
                    }
                }
                
            }
            
            
            
        }
    }
    //copy字节文件
    public static void copyByte(String srcF,String desF) {
        try(    FileInputStream fis = new FileInputStream(srcF);
                FileOutputStream fos = new FileOutputStream(desF);) {
            
            int len = 0;
            byte[] bytes = new byte[1024];//这一行代码当时不会写了
            if((len = fis.read()) != -1) {
                fis.read(bytes);
                
                //写入数据
                fos.write(bytes);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("复制成功!");
    }
    
    //copy字符文件
    public static void copyChar(String srcF,String desF) {
        try(    FileReader fis = new FileReader(srcF);
                FileWriter fos = new FileWriter(desF);) {
            
            int len = 0;
            char[] chars = new char[1024];//这一行代码当时不会写了
            if((len = fis.read()) != -1) {
                fis.read(chars);
                
                //写入数据
                fos.write(chars);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("复制成功!");
    }
}

⑦deleteFile 类

package filetest;

import java.io.File;

public class deleteFile {
    public static void deFile(String src,String deFileName) {
        //创建file
        File file = new File(src+"//"+deFileName);
        if(file.exists()) {
            try {
                file.delete();
            }catch(Exception e) {
                e.printStackTrace();
            }
            System.out.println("删除成功");
        }
    }
}

3.运行结果

运行结果基本能够达到功能要求,目前局限性在于只能输出到特定文件夹中,也就是我自己提前设定好的文件夹,不够灵活。不过现在初学阶段没必要考虑这么多,等今天再看一下老师写的过程,就可以更加熟悉文件的操作了。

总结

这个程序虽然总体来说较为容易,但对于我来说,写起来还是比较费脑筋的。不过现在写完之后,确实收获了很多知识。继续加油吧!

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

推荐阅读更多精彩内容

  • win7 cmd管理员权限设置 net localgroup administrators 用户名 /add 把“...
    f675b1a02698阅读 5,169评论 0 11
  • 命令简介 cmd是command的缩写.即命令行 。 虽然随着计算机产业的发展,Windows 操作系统的应用越来...
    Littleston阅读 3,316评论 0 12
  • 一、命令行 1. calc-----------启动计算器 2.certmgr.msc----证书管理实用程序 3...
    小小辛_c阅读 701评论 0 2
  • 运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本) CM...
    小沐子_IT阅读 2,099评论 0 4
  • 运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本) CM...
    小明yz阅读 2,753评论 0 8