码迷,mamicode.com
首页 > 系统相关 > 详细

Shell命令窗口制作

时间:2016-04-16 19:05:22      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:

这是一个类似于win下面的cmd打开后的窗口,可以跨平台使用,可以在win和linux下面同时使用,主要功能如下:

  

技术分享
首先我们需要把这些功能的目录写出来,通过写一个死循环,让其每次回车之后都可以保持同样的标题:如,/home/admin1>:

[java] view plain copy
 print?技术分享技术分享
  1. <span style="white-space:pre">    </span>String userPath = System.getProperty("user.home");  
  2. <span style="white-space:pre">        </span>Scanner sc = new Scanner(System.in);  
[java] view plain copy
 print?技术分享技术分享
  1. // 死循环  
  2.         while (true) {  
  3.             System.out.println(userPath + ">:");  
  4.             String command = sc.nextLine().trim();  
  5.             // command是用户输入的命令,这种命令有的会改变userPath的值  
  6.             if ("exit".equals(command)) {  
  7.                 // 退出程序,打断循环  
  8.                 break;  
  9.             } else if ("help".equals(command)) {  
  10.                 // 使用FileInputStream来读取 help.txt文件  
  11.                 helpOp();  
  12.             } else if ("date".equals(command)) {  
  13.                 dateOp();  
  14.             } else if (command != null && !"".equals(command)  
  15.                     && command.startsWith("dir")) {  
  16.                 // command:dir显示userPath下的内容  
  17.                 dirOp(userPath, command);  
  18.             } else if (command != null && !"".equals(command)  
  19.                     && command.startsWith("cat")) {  
  20.                 catOp(command); // cat绝对路径  
  21.             } else if (command != null && !"".equals(command)  
  22.                     && command.startsWith("type")) {  
  23.                 typeOp(command); // 绝对路径  
  24.             } else if (command != null && !"".equals(command)  
  25.                     && command.startsWith("md")) {  
  26.                 mdOp(userPath, command); // 相对路径  
  27.             } else if (command != null && !"".equals(command)  
  28.                     && command.startsWith("ren")) {  
  29.                 renOp(userPath, command); // 原文件的相对路径名 新文件名 ren/home/a/a.txt  
  30.                                             // /home/a/a/b.txt  
  31.             } else if (command != null && !"".equals(command)  
  32.                     && command.startsWith("rd")) {  
  33.                 rdOp(userPath, command); // 目录相对路径名  
  34.             } else if (command != null && !"".equals(command)  
  35.                     && command.startsWith("del")) {  
  36.                 delOp(userPath, command); // 文件相对路径名  
  37.             } else if (command != null && !"".equals(command)  
  38.                     && command.startsWith("copy")) {  
  39.                 copyOp(userPath, command); // 文件相对路径 绝对路径  
  40.             } else if (command != null && !"".equals(command)  
  41.                     && command.startsWith("cut")) {  
  42.                 cutOp(userPath, command); // 原文件的相对路径名 相对路径  
  43.             } else if (command != null && !"".equals(command)  
  44.                     && command.startsWith("tree")) {  
  45.                 treeOp(userPath); // 输出当前目录下的所有文件 递归  
  46.             } else if (command != null && !"".equals(command)  
  47.                     && command.startsWith("cd")) {  
  48.                 userPath = cdOp(userPath, command); // cd. cd.. cd/ cd 目录 有返回值的  
  49.             } else {  
  50.                 System.out.println("找不到这条命令");  
  51.             }  
  52.         }  

当然,为了做到跨平台使用,我们可以先定义一下平台:

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
 print?技术分享技术分享
  1. // 区分操作系统  
  2.     private static int getSystemInfo() {  
  3.         // Properties就是一个键值对  
  4.         // Properties p=System.getProperties(); //System类当中存有当前系统的所有信息  
  5.         // Set<Entry<Object,Object>> set=p.entrySet(); //entry:键值对 Set:集合  
  6.         // Iterator<Entry<Object,Object>> its=set.iterator(); //迭代器  
  7.         // while(its.hasNext()){ //使用迭代器取出集合中的第一个元素,hasNext()返回true  
  8.         // Entry<Object,Object> entry=its.next(); //取出  
  9.         // System.out.println(entry.getKey()+":"+entry.getValue());  
  10.         // }  
  11.   
  12.         String osName = System.getProperty("os.name");  
  13.         if (osName.toLowerCase().indexOf("linux") >= 0) {  
  14.             return OS_TYPE_LINUX;  
  15.         } else if (osName.toLowerCase().indexOf("windows") >= 0) {  
  16.             return OS_TYPE_WINDOWS;  
  17.         } else {  
  18.             return -1;  
  19.         }  
  20.     }  

如果你想查看一下你盘符的容量,我们可以这样做。

[java] view plain copy
 print?技术分享技术分享
  1. // 显示版权  
  2.     private static void showCopyRight() {  
  3.         int ostype = getSystemInfo();  
  4.         if (ostype == OS_TYPE_LINUX) {  
  5.             System.out.println("ubuntu linux zp");  
  6.         } else if (ostype == OS_TYPE_WINDOWS) {  
  7.             System.out.println("Micrsoft windows zp");  
  8.             System.out.println("Copyright by (2016-2028)");  
  9.         }  
  10.   
  11.         System.out.println("当前系统的盘符:");  
  12.         File[] fs = File.listRoots();  
  13.         System.out.println("盘符名\t总大小\t剩余空间:");  
  14.         for (File file : fs) {  
  15.             System.out.println(file.getAbsolutePath() + "\t"  
  16.                     + getSizeInPrety(file.getTotalSpace()) + "\t"  
  17.                     + getSizeInPrety(file.getFreeSpace()));  
  18.         }  
  19.   
  20.     }  
哦!好吧,如果只是这样写,那么显示出来的都是k为大小的,所以我们还要判断一下,把大小显示为G,M,K,B等

[java] view plain copy
 print?技术分享技术分享
  1. private static String getSizeInPrety(long size) {  
  2.         if (size / 1024 / 1024 / 1024 / 1024 > 0) {  
  3.             return size / 1024 / 1024 / 1024 / 1024 + "T";  
  4.         } else if (size / 1024 / 1024 / 1024 > 0) {  
  5.             return size / 1024 / 1024 / 1024 + "G";  
  6.         } else if (size / 1024 / 1024 > 0) {  
  7.             return size / 1024 / 1024 + "M";  
  8.         } else if (size / 1024 > 0) {  
  9.             return size / 1024 + "K";  
  10.         } else {  
  11.             return size + "B";  
  12.         }  
  13.     }  

好了,言归正传,我们开始写以上要实现的14条命令。

1、先来写help好了,这样我们就可以看一下帮助了(在不知道有哪些命令的情况下),既然想写help,那么我们就先把help.txt这个文档准备好,然后通过 使用FileInputStream来读取 help.txt文件。最后把这个显示出来就可以了。

[java] view plain copy
 print?技术分享技术分享
  1. private static void helpOp() throws IOException {  
  2.         // 使用FileInputStream来读取 help.txt文件  
  3.   
  4.         // 通过test1的字节码类,找到它的字节码加载器,这个加载器从bin目录开始扫描,查找help.txt文件,再自动以流的方式加载它  
  5.         InputStream fis = test1.class.getClassLoader().getResourceAsStream(  
  6.                 "help.txt");  
  7.         // File filename=new  
  8.         // File(System.getProperty("java.class.path")+File.separator+"help.txt");  
  9.         // FileInputStream fis = new FileInputStream(filename);  
  10.         // 第三步:操作!  
  11.         byte[] buff = new byte[1024];  
  12.         int len = -1;// 定义缓冲区  
  13.         while ((len = fis.read(buff, 0, buff.length)) != -1) {  
  14.             String s = new String(buff, 0, len, "gbk");  
  15.             System.out.println(s);  
  16.         }  
  17.         // 第四步:关闭资源(字符流必须关闭资源,因为它中间有缓冲区!对于字节流可以不用关闭,但是还是建议写上,习惯!)  
  18.         fis.close();  
  19.   
  20.     }  

2、然后我们写一下退出吧!纳尼,退出还需要写么,根本不需要好吧,我在前面已经写了,直接break就好了啊,你说你是不是傻技术分享!你自己看我的第一段代码!

3、既然如此,那我们就来写一下date吧,这个可以用来查看系统时间。用SimpleDateFormat来格式化一个时间。

[java] view plain copy
 print?技术分享技术分享
  1. private static void dateOp() {  
  2.     // TODO Auto-generated method stub  
  3.     Date d = new Date();  
  4.     SimpleDateFormat sd = new SimpleDateFormat("yyyy-M-d HH:mm:ss E");  
  5.     String s = sd.format(d);// 这个方法继承于SimpleDateFormat的父类DateFormat类!  
  6.     System.out.println(s);  
  7. }  

4、那我们再来看一下dir命令吧!dir是可以查看所有的文件和目录的哦,注意不要查看路径太深的文件夹,不然的话,嘿嘿,会循环调用很久哒!这里我们可以统计一下总共有多少个文件和目录,然后还可以判断一下文件的权限rwx,当然,还可以计算一下大小啦,那么我们就可以调用前面说过的getSizeInPrety()方法来格式化一下G,M,K等的大小。
[java] view plain copy
 print?技术分享技术分享
  1. private static void dirOp(String userPath, String command) {  
  2.         String[] contents = command.split(" ");  
  3.         if (contents.length == 2) {  
  4.             // 如果长度为2,就显示userPath下的内容  
  5.             userPath = contents[1];  
  6.         }  
  7.         // y用file类来完成取到这个目录的信息  
  8.         File f = new File(userPath);  
  9.         File[] fs = f.listFiles();  
  10.   
  11.         int totalFile = 0;  
  12.         int totalDir = 0;  
  13.         long totalFileSize = 0;  
  14.         if (fs != null && fs.length > 0) {  
  15.             for (File file : fs) {  
  16.                 long time = file.lastModified();  
  17.                 Date d = new Date();  
  18.                 SimpleDateFormat sd = new SimpleDateFormat("yyyy-M-d HH:mm");  
  19.                 String timeString = sd.format(time);  
  20.   
  21.                 // 权限  
  22.                 String read = file.canRead() ? "r" : "-";  
  23.                 String write = file.canWrite() ? "w" : "-";  
  24.                 String execute = file.canExecute() ? "x" : "-";  
  25.   
  26.                 // 文件还是目录  
  27.                 String fileorDir = file.isFile() ? "\t" : "<dir>";  
  28.                 // 取大小  
  29.                 long fileSize = file.isFile() ? file.length() : 0;  
  30.                 String fileSizeString = "\t";  
  31.                 if (file.isFile()) {  
  32.                     fileSizeString = getSizeInPrety(fileSize);  
  33.                     totalFile++;  
  34.                     totalFileSize += fileSize;  
  35.                 } else {  
  36.                     totalDir++;  
  37.                 }  
  38.                 System.out.println(timeString + "\t\t" + read + write + execute  
  39.                         + "\t" + fileorDir + "\t" + fileSizeString  
  40.                         + file.getName());  
  41.             }  
  42.         }  
  43.         System.out.println("总共有:" + totalFile + "个文件," + totalDir + "个目录");  
  44.     }  

5、那cat命令也类似,

[java] view plain copy
 print?技术分享技术分享
  1. private static void catOp(String command) {  
  2.   
  3.         // 解析command中的文件  
  4.         String[] contents = command.split(" ");  
  5.         String filePath = null;  
  6.         if (contents.length == 2) {  
  7.             // 如果长度为2,就显示userPath下的内容  
  8.             filePath = contents[1];  
  9.         }  
  10.         // 用file类来完成取到这个目录的信息  
  11.         File f = new File(filePath);  
  12.         if (f.exists() == false || f.isFile() == false) {  
  13.             System.out.println(f.getName() + "不是一个有效文件,无法读取");  
  14.             return;  
  15.         }  
  16.         FileReader fr = null;  
  17.         try {  
  18.             fr = new FileReader(f);  
  19.             BufferedReader br = new BufferedReader(fr);  
  20.   
  21.             String line = null;  
  22.             int num = 0;  
  23.   
  24.             while ((line = br.readLine()) != null) {  
  25.                 num++;  
  26.                 System.out.println(num + "\t" + line);  
  27.             }  
  28.         } catch (Exception e) {  
  29.             e.printStackTrace();  
  30.         } finally {  
  31.             try {  
  32.                 fr.close();  
  33.             } catch (IOException e) {  
  34.                 e.printStackTrace();  
  35.             }  
  36.         }  
  37.     }  

6、type的话呢,好像也差不多。

[java] view plain copy
 print?技术分享技术分享
  1. private static void typeOp(String command) throws IOException {  
  2.         // TODO Auto-generated method stub  
  3.         // 使用BuffedInputStream来完成  
  4.         // 解析command中的文件  
  5.         String[] strs = command.split(" ");  
  6.   
  7.         if (strs == null || strs.length != 2) {  
  8.             System.out.println(command + "格式,标准格式:type 文件的绝对路径,请确认后重新输入");  
  9.             return;  
  10.         }  
  11.         File file = new File(strs[1]);  
  12.         if (file.exists() == false) {  
  13.             System.out.println(file.getAbsolutePath() + "文件不存在");  
  14.             return;  
  15.         }  
  16.         if (file.isFile() == false) {  
  17.             System.out.println(file.getAbsolutePath() + "不是一个可以读取的文件");  
  18.             return;  
  19.         }  
  20.         InputStream iis = null;  
  21.   
  22.         try {  
  23.             iis = new BufferedInputStream(new FileInputStream(file));  
  24.             byte[] bs = new byte[1024];  
  25.             int length = -1;  
  26.             while ((length = iis.read(bs, 0, bs.length)) != -1) {  
  27.                 String s = new String(bs, 0, length, "gbk");  
  28.                 System.out.println(s);  
  29.             }  
  30.         } catch (Exception e) {  
  31.             // TODO Auto-generated catch block  
  32.             e.printStackTrace();  
  33.         } finally {  
  34.             try {  
  35.                 iis.close();  
  36.             } catch (IOException e) {  
  37.                 e.printStackTrace();  
  38.             }  
  39.         }  
  40.   
  41.     }  
7、现在,我们就可以来看一下如何创建目录的吧!这种的话如果不会一定要多看一些API文档了。

[java] view plain copy
 print?技术分享技术分享
  1. private static void mdOp(String userPath, String command) {  
  2.     // 在userPath下面创建一个目录 md/a/b/c md/a  
  3.     // File类中的mkdirs()  
  4.     String[] strs = command.split(" ");  
  5.   
  6.     if (strs == null || strs.length != 2) {  
  7.         System.out.println(command + "格式,标准格式:md  文件的相对路径,请确认后重新输入");  
  8.         return;  
  9.     }  
  10.     File f = new File(userPath, strs[1]);  
  11.     if (f.exists()) {  
  12.         System.out.println("文件已存在,无需创建");  
  13.         return;  
  14.     }  
  15.     // 创建目录  
  16.     System.out.println(f.mkdir() ? "创建目录成功" : "创建目录失败");  
  17.     System.out.println();<span style="font-family: Arial, Helvetica, sans-serif;">}</span>  

Shell命令窗口制作

标签:

原文地址:http://blog.csdn.net/sjzfhyykp/article/details/51167926

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!