这是一个类似于win下面的cmd打开后的窗口,可以跨平台使用,可以在win和linux下面同时使用,主要功能如下:
首先我们需要把这些功能的目录写出来,通过写一个死循环,让其每次回车之后都可以保持同样的标题:如,/home/admin1>:
[java] view
plain copy
- <span style="white-space:pre"> </span>String userPath = System.getProperty("user.home");
- <span style="white-space:pre"> </span>Scanner sc = new Scanner(System.in);
[java] view
plain copy
- // 死循环
- while (true) {
- System.out.println(userPath + ">:");
- String command = sc.nextLine().trim();
- // command是用户输入的命令,这种命令有的会改变userPath的值
- if ("exit".equals(command)) {
- // 退出程序,打断循环
- break;
- } else if ("help".equals(command)) {
- // 使用FileInputStream来读取 help.txt文件
- helpOp();
- } else if ("date".equals(command)) {
- dateOp();
- } else if (command != null && !"".equals(command)
- && command.startsWith("dir")) {
- // command:dir显示userPath下的内容
- dirOp(userPath, command);
- } else if (command != null && !"".equals(command)
- && command.startsWith("cat")) {
- catOp(command); // cat绝对路径
- } else if (command != null && !"".equals(command)
- && command.startsWith("type")) {
- typeOp(command); // 绝对路径
- } else if (command != null && !"".equals(command)
- && command.startsWith("md")) {
- mdOp(userPath, command); // 相对路径
- } else if (command != null && !"".equals(command)
- && command.startsWith("ren")) {
- renOp(userPath, command); // 原文件的相对路径名 新文件名 ren/home/a/a.txt
- // /home/a/a/b.txt
- } else if (command != null && !"".equals(command)
- && command.startsWith("rd")) {
- rdOp(userPath, command); // 目录相对路径名
- } else if (command != null && !"".equals(command)
- && command.startsWith("del")) {
- delOp(userPath, command); // 文件相对路径名
- } else if (command != null && !"".equals(command)
- && command.startsWith("copy")) {
- copyOp(userPath, command); // 文件相对路径 绝对路径
- } else if (command != null && !"".equals(command)
- && command.startsWith("cut")) {
- cutOp(userPath, command); // 原文件的相对路径名 相对路径
- } else if (command != null && !"".equals(command)
- && command.startsWith("tree")) {
- treeOp(userPath); // 输出当前目录下的所有文件 递归
- } else if (command != null && !"".equals(command)
- && command.startsWith("cd")) {
- userPath = cdOp(userPath, command); // cd. cd.. cd/ cd 目录 有返回值的
- } else {
- System.out.println("找不到这条命令");
- }
- }
当然,为了做到跨平台使用,我们可以先定义一下平台:
public final static int OS_TYPE_LINUX = 1; // linux操作系统
public final static int OS_TYPE_WINDOWS = 2; // window操作系统
我们还需要拿到操作系统的名字,当然首先我们来看一下操作系统的详细信息,我们可以使用System.getProperties()来查看系统的所有信息,这个时候我们就会发现,user.home就是我们的系统名,所以我们要把这个拿来使用。
[java] view
plain copy
- // 区分操作系统
- private static int getSystemInfo() {
- // Properties就是一个键值对
- // Properties p=System.getProperties(); //System类当中存有当前系统的所有信息
- // Set<Entry<Object,Object>> set=p.entrySet(); //entry:键值对 Set:集合
- // Iterator<Entry<Object,Object>> its=set.iterator(); //迭代器
- // while(its.hasNext()){ //使用迭代器取出集合中的第一个元素,hasNext()返回true
- // Entry<Object,Object> entry=its.next(); //取出
- // System.out.println(entry.getKey()+":"+entry.getValue());
- // }
- String osName = System.getProperty("os.name");
- if (osName.toLowerCase().indexOf("linux") >= 0) {
- return OS_TYPE_LINUX;
- } else if (osName.toLowerCase().indexOf("windows") >= 0) {
- return OS_TYPE_WINDOWS;
- } else {
- return -1;
- }
- }
如果你想查看一下你盘符的容量,我们可以这样做。
[java] view
plain copy
- // 显示版权
- private static void showCopyRight() {
- int ostype = getSystemInfo();
- if (ostype == OS_TYPE_LINUX) {
- System.out.println("ubuntu linux zp");
- } else if (ostype == OS_TYPE_WINDOWS) {
- System.out.println("Micrsoft windows zp");
- System.out.println("Copyright by (2016-2028)");
- }
- System.out.println("当前系统的盘符:");
- File[] fs = File.listRoots();
- System.out.println("盘符名\t总大小\t剩余空间:");
- for (File file : fs) {
- System.out.println(file.getAbsolutePath() + "\t"
- + getSizeInPrety(file.getTotalSpace()) + "\t"
- + getSizeInPrety(file.getFreeSpace()));
- }
- }
哦!好吧,如果只是这样写,那么显示出来的都是k为大小的,所以我们还要判断一下,把大小显示为G,M,K,B等
[java] view
plain copy
- private static String getSizeInPrety(long size) {
- if (size / 1024 / 1024 / 1024 / 1024 > 0) {
- return size / 1024 / 1024 / 1024 / 1024 + "T";
- } else if (size / 1024 / 1024 / 1024 > 0) {
- return size / 1024 / 1024 / 1024 + "G";
- } else if (size / 1024 / 1024 > 0) {
- return size / 1024 / 1024 + "M";
- } else if (size / 1024 > 0) {
- return size / 1024 + "K";
- } else {
- return size + "B";
- }
- }
好了,言归正传,我们开始写以上要实现的14条命令。
1、先来写help好了,这样我们就可以看一下帮助了(在不知道有哪些命令的情况下),既然想写help,那么我们就先把help.txt这个文档准备好,然后通过 使用FileInputStream来读取 help.txt文件。最后把这个显示出来就可以了。
[java] view
plain copy
- private static void helpOp() throws IOException {
- // 使用FileInputStream来读取 help.txt文件
- // 通过test1的字节码类,找到它的字节码加载器,这个加载器从bin目录开始扫描,查找help.txt文件,再自动以流的方式加载它
- InputStream fis = test1.class.getClassLoader().getResourceAsStream(
- "help.txt");
- // File filename=new
- // File(System.getProperty("java.class.path")+File.separator+"help.txt");
- // FileInputStream fis = new FileInputStream(filename);
- // 第三步:操作!
- byte[] buff = new byte[1024];
- int len = -1;// 定义缓冲区
- while ((len = fis.read(buff, 0, buff.length)) != -1) {
- String s = new String(buff, 0, len, "gbk");
- System.out.println(s);
- }
- // 第四步:关闭资源(字符流必须关闭资源,因为它中间有缓冲区!对于字节流可以不用关闭,但是还是建议写上,习惯!)
- fis.close();
- }
2、然后我们写一下退出吧!纳尼,退出还需要写么,根本不需要好吧,我在前面已经写了,直接break就好了啊,你说你是不是傻!你自己看我的第一段代码!
3、既然如此,那我们就来写一下date吧,这个可以用来查看系统时间。用SimpleDateFormat来格式化一个时间。
[java] view
plain copy
- private static void dateOp() {
- // TODO Auto-generated method stub
- Date d = new Date();
- SimpleDateFormat sd = new SimpleDateFormat("yyyy-M-d HH:mm:ss E");
- String s = sd.format(d);// 这个方法继承于SimpleDateFormat的父类DateFormat类!
- System.out.println(s);
- }
4、那我们再来看一下dir命令吧!dir是可以查看所有的文件和目录的哦,注意不要查看路径太深的文件夹,不然的话,嘿嘿,会循环调用很久哒!这里我们可以统计一下总共有多少个文件和目录,然后还可以判断一下文件的权限rwx,当然,还可以计算一下大小啦,那么我们就可以调用前面说过的getSizeInPrety()方法来格式化一下G,M,K等的大小。
[java] view
plain copy
- private static void dirOp(String userPath, String command) {
- String[] contents = command.split(" ");
- if (contents.length == 2) {
- // 如果长度为2,就显示userPath下的内容
- userPath = contents[1];
- }
- // y用file类来完成取到这个目录的信息
- File f = new File(userPath);
- File[] fs = f.listFiles();
- int totalFile = 0;
- int totalDir = 0;
- long totalFileSize = 0;
- if (fs != null && fs.length > 0) {
- for (File file : fs) {
- long time = file.lastModified();
- Date d = new Date();
- SimpleDateFormat sd = new SimpleDateFormat("yyyy-M-d HH:mm");
- String timeString = sd.format(time);
- // 权限
- String read = file.canRead() ? "r" : "-";
- String write = file.canWrite() ? "w" : "-";
- String execute = file.canExecute() ? "x" : "-";
- // 文件还是目录
- String fileorDir = file.isFile() ? "\t" : "<dir>";
- // 取大小
- long fileSize = file.isFile() ? file.length() : 0;
- String fileSizeString = "\t";
- if (file.isFile()) {
- fileSizeString = getSizeInPrety(fileSize);
- totalFile++;
- totalFileSize += fileSize;
- } else {
- totalDir++;
- }
- System.out.println(timeString + "\t\t" + read + write + execute
- + "\t" + fileorDir + "\t" + fileSizeString
- + file.getName());
- }
- }
- System.out.println("总共有:" + totalFile + "个文件," + totalDir + "个目录");
- }
5、那cat命令也类似,
[java] view
plain copy
- private static void catOp(String command) {
- // 解析command中的文件
- String[] contents = command.split(" ");
- String filePath = null;
- if (contents.length == 2) {
- // 如果长度为2,就显示userPath下的内容
- filePath = contents[1];
- }
- // 用file类来完成取到这个目录的信息
- File f = new File(filePath);
- if (f.exists() == false || f.isFile() == false) {
- System.out.println(f.getName() + "不是一个有效文件,无法读取");
- return;
- }
- FileReader fr = null;
- try {
- fr = new FileReader(f);
- BufferedReader br = new BufferedReader(fr);
- String line = null;
- int num = 0;
- while ((line = br.readLine()) != null) {
- num++;
- System.out.println(num + "\t" + line);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- fr.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
6、type的话呢,好像也差不多。
[java] view
plain copy
- private static void typeOp(String command) throws IOException {
- // TODO Auto-generated method stub
- // 使用BuffedInputStream来完成
- // 解析command中的文件
- String[] strs = command.split(" ");
- if (strs == null || strs.length != 2) {
- System.out.println(command + "格式,标准格式:type 文件的绝对路径,请确认后重新输入");
- return;
- }
- File file = new File(strs[1]);
- if (file.exists() == false) {
- System.out.println(file.getAbsolutePath() + "文件不存在");
- return;
- }
- if (file.isFile() == false) {
- System.out.println(file.getAbsolutePath() + "不是一个可以读取的文件");
- return;
- }
- InputStream iis = null;
- try {
- iis = new BufferedInputStream(new FileInputStream(file));
- byte[] bs = new byte[1024];
- int length = -1;
- while ((length = iis.read(bs, 0, bs.length)) != -1) {
- String s = new String(bs, 0, length, "gbk");
- System.out.println(s);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- iis.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
7、现在,我们就可以来看一下如何创建目录的吧!这种的话如果不会一定要多看一些API文档了。
[java] view
plain copy
- private static void mdOp(String userPath, String command) {
- // 在userPath下面创建一个目录 md/a/b/c md/a
- // File类中的mkdirs()
- String[] strs = command.split(" ");
- if (strs == null || strs.length != 2) {
- System.out.println(command + "格式,标准格式:md 文件的相对路径,请确认后重新输入");
- return;
- }
- File f = new File(userPath, strs[1]);
- if (f.exists()) {
- System.out.println("文件已存在,无需创建");
- return;
- }
- // 创建目录
- System.out.println(f.mkdir() ? "创建目录成功" : "创建目录失败");
- System.out.println();<span style="font-family: Arial, Helvetica, sans-serif;">}</span>