Shell命令窗口制作

这是一个类似于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. String osName = System.getProperty("os.name");
  12. if (osName.toLowerCase().indexOf("linux") >= 0) {
  13. return OS_TYPE_LINUX;
  14. } else if (osName.toLowerCase().indexOf("windows") >= 0) {
  15. return OS_TYPE_WINDOWS;
  16. } else {
  17. return -1;
  18. }
  19. }

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

[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. System.out.println("当前系统的盘符:");
  11. File[] fs = File.listRoots();
  12. System.out.println("盘符名\t总大小\t剩余空间:");
  13. for (File file : fs) {
  14. System.out.println(file.getAbsolutePath() + "\t"
  15. + getSizeInPrety(file.getTotalSpace()) + "\t"
  16. + getSizeInPrety(file.getFreeSpace()));
  17. }
  18. }

哦!好吧,如果只是这样写,那么显示出来的都是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. // 通过test1的字节码类,找到它的字节码加载器,这个加载器从bin目录开始扫描,查找help.txt文件,再自动以流的方式加载它
  4. InputStream fis = test1.class.getClassLoader().getResourceAsStream(
  5. "help.txt");
  6. // File filename=new
  7. // File(System.getProperty("java.class.path")+File.separator+"help.txt");
  8. // FileInputStream fis = new FileInputStream(filename);
  9. // 第三步:操作!
  10. byte[] buff = new byte[1024];
  11. int len = -1;// 定义缓冲区
  12. while ((len = fis.read(buff, 0, buff.length)) != -1) {
  13. String s = new String(buff, 0, len, "gbk");
  14. System.out.println(s);
  15. }
  16. // 第四步:关闭资源(字符流必须关闭资源,因为它中间有缓冲区!对于字节流可以不用关闭,但是还是建议写上,习惯!)
  17. fis.close();
  18. }

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. int totalFile = 0;
  11. int totalDir = 0;
  12. long totalFileSize = 0;
  13. if (fs != null && fs.length > 0) {
  14. for (File file : fs) {
  15. long time = file.lastModified();
  16. Date d = new Date();
  17. SimpleDateFormat sd = new SimpleDateFormat("yyyy-M-d HH:mm");
  18. String timeString = sd.format(time);
  19. // 权限
  20. String read = file.canRead() ? "r" : "-";
  21. String write = file.canWrite() ? "w" : "-";
  22. String execute = file.canExecute() ? "x" : "-";
  23. // 文件还是目录
  24. String fileorDir = file.isFile() ? "\t" : "<dir>";
  25. // 取大小
  26. long fileSize = file.isFile() ? file.length() : 0;
  27. String fileSizeString = "\t";
  28. if (file.isFile()) {
  29. fileSizeString = getSizeInPrety(fileSize);
  30. totalFile++;
  31. totalFileSize += fileSize;
  32. } else {
  33. totalDir++;
  34. }
  35. System.out.println(timeString + "\t\t" + read + write + execute
  36. + "\t" + fileorDir + "\t" + fileSizeString
  37. + file.getName());
  38. }
  39. }
  40. System.out.println("总共有:" + totalFile + "个文件," + totalDir + "个目录");
  41. }

5、那cat命令也类似,

[java] view
plain
 copy

print?

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

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. if (strs == null || strs.length != 2) {
  7. System.out.println(command + "格式,标准格式:type 文件的绝对路径,请确认后重新输入");
  8. return;
  9. }
  10. File file = new File(strs[1]);
  11. if (file.exists() == false) {
  12. System.out.println(file.getAbsolutePath() + "文件不存在");
  13. return;
  14. }
  15. if (file.isFile() == false) {
  16. System.out.println(file.getAbsolutePath() + "不是一个可以读取的文件");
  17. return;
  18. }
  19. InputStream iis = null;
  20. try {
  21. iis = new BufferedInputStream(new FileInputStream(file));
  22. byte[] bs = new byte[1024];
  23. int length = -1;
  24. while ((length = iis.read(bs, 0, bs.length)) != -1) {
  25. String s = new String(bs, 0, length, "gbk");
  26. System.out.println(s);
  27. }
  28. } catch (Exception e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. } finally {
  32. try {
  33. iis.close();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }

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. if (strs == null || strs.length != 2) {
  6. System.out.println(command + "格式,标准格式:md  文件的相对路径,请确认后重新输入");
  7. return;
  8. }
  9. File f = new File(userPath, strs[1]);
  10. if (f.exists()) {
  11. System.out.println("文件已存在,无需创建");
  12. return;
  13. }
  14. // 创建目录
  15. System.out.println(f.mkdir() ? "创建目录成功" : "创建目录失败");
  16. System.out.println();<span style="font-family: Arial, Helvetica, sans-serif;">}</span>
时间: 2024-11-08 08:58:18

Shell命令窗口制作的相关文章

手把手教你做一个Shell命令窗口

这是一个类似于win下面的cmd打开后的窗口,可以跨平台使用,可以在win和linux下面同时使用,主要功能如下: 首先我们需要把这些功能的目录写出来,通过写一个死循环,让其每次回车之后都可以保持同样的标题:如,/home/admin1>: <span style="white-space:pre"> </span>String userPath = System.getProperty("user.home"); <span s

添加右键菜单命令 在此处打开命令窗口(W)(带图标)

@color 0A @title 添加右键菜单命令 在此处打开命令窗口(W)(带图标) by wjshan0808 @echo off reg add HKCR\Directory\Background\shell\在此处打开命令窗口(W) /v Icon /t reg_expand_sz /d %ComSpec% /f reg add HKCR\Directory\Background\shell\在此处打开命令窗口(W)\command /ve /t reg_sz /d "%ComSpec%

Matlab使用新发现1(小技巧:shell 命令、工程工作目录设置相关)

最近在调试一个基于Matlab的程序,在偶然间发现了几个比较有趣的技巧,给大家分享一下(很可能是太菜鸟了,没有涉及这方面,大方之家请勿见笑,对您有所帮助请点赞!) 1. Matlab语言是一种解释型语言(interpreter) 就像我在总结软件架构数据流时的一种:Interpreter / virtual machine (解释器/虚拟机),具体架构可以参看以下博文:http://blog.csdn.net/lg1259156776/article/details/46802107(解释性语言

shell命令大全

Shell命令合集 Ccat zdd 浏览文件zdd的内容cat zdd1 zdd2 浏览多个文件的内容cat -n zdd浏览文件zdd的内容并显示行号 cd 回到起始目录,也即刚登陆到系统的目录,cd后面无参数cd / 回到根目录cd .. 返回上一级目录 cd - 返回到最近使用的目录 Ddf -kh 查看磁盘信息 du -sh foldername 查看文件夹大小,-h表示以human readable格式显示大小,-s表示累加各个文件的大小. Hhistory 显示命令历史记录host

Bash shell命令记录和CentOS的一些技巧

①CentOS的实用技巧: 一.按下ctrl+alt+F2可由图形界面切换至命令行(shell窗口),按下ctrl+alt+F1可由命令行切换至图形界面(前提是安装CentOS时软件选择项选择安装了图形界面,一般是GNOME) ②shell命令记录: 一.ifconfig命令是Linux中用于显示或配置网络设备的命令,英文全称是network interfaces configuring.配置网卡的IP地址语法例:ifconfig eth0 192.168.0.1 netmask 255.255

二十七、Linux下常用的shell命令记录

本文章记录我在linux系统下常用或有用的系统级命令,包括软硬件查看.修改命令,有CPU.内存.硬盘.网络.系统管理等命令.但本文不打算介绍生僻命令,也不介绍各个linux发行版下的特有命令,且以后会持续更新. 说明,我是在一个Centos 6.4 64位的虚拟机系统进行测试.本文介绍的命令都会在此Centos下运行验证(也有部分命令会在我的suse/ubuntu系统里测试的,会做特明说明),但运行结果就不再列出了. 硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /pro

苹果Mac OS系统shell命令大全介绍

基本命令 1.列出文件 ls 参数 目录名        例: 看看驱动目录下有什么:ls /System/Library/Extensions 参数 -w 显示中文,-l 详细信息, -a 包括隐藏文件 2.转换目录 cd    例:想到驱动目录下溜达一圈   cd /System/Library/Extensions 3.建立新目录 mkdir 目录名     例:在驱动目录下建一个备份目录 backup     mkdir /System/Library/Extensions/backup

win7右键点击文件夹进入命令窗口方法

方法一:按住shift键,鼠标右击,会出现"在此处打开命令窗口":方法二:修改注册表,为鼠标右键添加打开命令行功能:(1)将下列内容赋值到记事本中,并保存为.reg文件.Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\folder\shell\cmd]@="在此位置打开CMD"[HKEY_CLASSES_ROOT\folder\shell\cmd\command]@="cmd.exe /k c

实验一 用户界面与Shell命令

一.实验课时:2学时 二.实验目的 v  熟悉redhat_linux的用户界面,会进行常用的系统设置. v  掌握常用的shell命令. 三.实验环境 v  运行Windows xp\2000\2003等操作系统的计算机: v  VMware虚拟机上运行redhat enterprise 5 四.实验过程 点击桌面上的VMware文件夹,找到VMware快捷方式图标. 2.  双击快捷方式图标启动虚拟机,选择redhat enterprise 5 虚拟机并启动. 在虚拟机启动后的redhat