如果你接触过windows操作系统,你应该对windows中的cmd有一定的了解。

如果你接触过Linux操作系统,你应该对Linux的shell有一定的了解。

本文说的正是linux中的shell。不过这个是我用java编程实现的“shell”。

现在的功能有三个:

1.扫描文件(过滤文件),如:“c:\\ gif”,命令是在C盘下面,查找后缀是.gif的文件,并且打印到控制台上。

2.命令:“cd c:\\users”,把路径“c:\\users"下面的所有文件打印出来,并且进行统计。

3.命令:“exit”,退出系统。

先来看看项目的结构:

运行的效果:

one:

two:

three:

====================================================

Original Source Part!

Description:

I use the static proxy design pattern in this java project.When the user input

content in the console,then the system will monitoring and get the content,and

process it quickly.

The original source as following:

====================================================

/scanFiles/src/com/b510/scanFiles/dao/ScanFiles.java

 /**
*
*/
package com.b510.scanFiles.dao; /**
* the interface for the Scan Files
* @author Hongten
* @created Feb 12, 2014
*/
public interface ScanFiles { public int scan(String[] inputs);
public void handleCD(String[] inputs);
public void scanFiles(String[] inputs);
}

/scanFiles/src/com/b510/scanFiles/dao/impl/ScanDelegate.java

 /**
*
*/
package com.b510.scanFiles.dao.impl; import java.io.File; import com.b510.scanFiles.dao.ScanFiles;
import com.b510.scanFiles.utils.CommonUtil;
import com.b510.scanFiles.utils.PrintUtil; /**
* the Delegate for the Scan Files.
* @author Hongten
* @created Feb 12, 2014
*/
public class ScanDelegate implements ScanFiles, Runnable { @SuppressWarnings("unused")
private String[] inputs;
private String path;
private String suffix;
private int targetCount;
private int folderCount;
private long startTime; public ScanDelegate(String[] inputs) {
this.inputs = inputs;
} public ScanDelegate(String path, String suffix) {
this.path = path;
this.suffix = suffix;
} public void scanFiles(String[] inputs) {
ScanDelegate delegate = new ScanDelegate(inputs[0], inputs[1]);
new Thread(delegate).start();
} /**
* scan the file(s) from the path,that user give.and return the count of the file(s).
*/
public int scan(String[] inputs) {
int fileCount = 0;
File file = new File(inputs[0]);
if (!file.exists()) {
PrintUtil.printInfo(CommonUtil.INCORRECT_PATH);
} else {
File[] subFile = file.listFiles();
if (null == subFile || subFile.length == 0) {
return fileCount;
}
for (int i = 0; i < subFile.length; i++) {
if (subFile[i].isDirectory()) {
folderCount++;
fileCount += scan(new String[] { subFile[i].getAbsolutePath() });
} else if (subFile[i].isFile()) {
if (getPostfix(subFile[i].getName()).equalsIgnoreCase(suffix)) {
PrintUtil.printInfo(CommonUtil.FIND_FILE + subFile[i].getAbsolutePath());
targetCount++;
}
fileCount++;
}
}
}
return fileCount;
} public void run() {
startTime = System.currentTimeMillis();
int num = scan(new String[] { path });
printResult(num);
} private void printResult(int num) {
PrintUtil.printInfo(CommonUtil.BOUNDARY);
PrintUtil.printInfo(CommonUtil.LEFT_BLANKETS + path + CommonUtil.CONTAINS);
PrintUtil.printInfo(CommonUtil.FOLDERS + folderCount);
PrintUtil.printInfo(CommonUtil.FILES + num);
PrintUtil.printInfo(CommonUtil.TARGET + suffix + CommonUtil.TARGET_FILES + targetCount);
PrintUtil.printInfo(CommonUtil.BOUNDARY);
long entTime = System.currentTimeMillis();
PrintUtil.printInfo(CommonUtil.SPEND + (entTime - startTime) + CommonUtil.MS);
} /**
* handle the situation,e.g: "cd e:\"
*/
public void handleCD(String[] inputs) {
File file = new File(inputs[1]);
if (!file.exists()) {
PrintUtil.printInfo(CommonUtil.INCORRECT_PATH);
} else {
File[] listFiles = file.listFiles();
for (int i = 0; i < listFiles.length; i++) {
PrintUtil.printInfo(listFiles[i].getName());
}
PrintUtil.printInfo(CommonUtil.BOUNDARY + "\n"+ CommonUtil.TOTAL + listFiles.length);
}
} /**
* get the suffix of a string,e.g : "test.txt"<br>
* and return the string is "txt".
* @param inputFilePath
* @return
*/
public String getPostfix(String inputFilePath) {
return inputFilePath.substring(inputFilePath.lastIndexOf(CommonUtil.POINT) + 1);
}
}

/scanFiles/src/com/b510/scanFiles/dao/impl/ScanProxy.java

 /**
*
*/
package com.b510.scanFiles.dao.impl; import com.b510.scanFiles.dao.ScanFiles;
import com.b510.scanFiles.utils.CommonUtil;
import com.b510.scanFiles.utils.PrintUtil; /**
* @author Hongten
* @created Feb 12, 2014
*/
public class ScanProxy implements ScanFiles { private ScanFiles scanDelegate; public ScanProxy(ScanFiles scanDelegate) {
this.scanDelegate = scanDelegate;
} public int scan(String[] inputs) {
scanFiles(inputs);
return 0;
} public void handleCD(String[] inputs) {
PrintUtil.printInfo(CommonUtil.BOUNDARY);
long startTime = System.currentTimeMillis();
scanDelegate.handleCD(inputs);
long entTime = System.currentTimeMillis();
PrintUtil.printInfo(CommonUtil.BOUNDARY);
PrintUtil.printInfo(CommonUtil.SPEND + (entTime - startTime) + CommonUtil.MS);
} public void scanFiles(String[] inputs) {
scanDelegate.scanFiles(inputs);
} }

/scanFiles/src/com/b510/scanFiles/factory/ScanFilesFactory.java

 /**
*
*/
package com.b510.scanFiles.factory; import com.b510.scanFiles.dao.ScanFiles;
import com.b510.scanFiles.dao.impl.ScanDelegate;
import com.b510.scanFiles.dao.impl.ScanProxy; /**
* The factory of the static proxy
* @author Hongten
* @created Feb 12, 2014
*/
public class ScanFilesFactory { public static ScanFiles getInstance(String[] inputs){
return new ScanProxy(new ScanDelegate(inputs));
}
}

/scanFiles/src/com/b510/scanFiles/utils/CommonUtil.java

 /**
*
*/
package com.b510.scanFiles.utils; /**
* @author Hongten
* @created Feb 12, 2014
*/
public class CommonUtil { public static final String DESCRIPTION = "Please input as this format :\n[C:\\ png] or [cd C:\\]";
public static final String EXIT_SYSTEM = "exited system.";
public static final String INCORRECT_PATH = "Incorrect path!";
public static final String INCORRECT_INPUT_FORMAT = "Incorrect input format!";
public static final String CD = "cd";
public static final String BLANK = " ";
public static final String EXIT = "exit";
public static final String POINT = "."; public static final String BOUNDARY = "======================================";
public static final String LEFT_BLANKETS = "[";
public static final String CONTAINS = "] contains :";
public static final String FOLDERS = "folder(s) : ";
public static final String FILES = "file(s) : ";
public static final String TARGET = "target [";
public static final String TARGET_FILES = "] file(s) : ";
public static final String SPEND = "Spend :[";
public static final String FIND_FILE = "Find file : ";
public static final String MS = "]ms";
public static final String TOTAL = "Total :"; public static final int TWO = 2;
}

/scanFiles/src/com/b510/scanFiles/utils/PrintUtil.java

 /**
*
*/
package com.b510.scanFiles.utils; /**
* @author Hongten
* @created Feb 12, 2014
*/
public class PrintUtil { public static void printInfo(String info) {
System.out.println(info);
} public static void printInfo(StringBuffer info) {
System.out.println(info);
} public static void printInfo(char info) {
System.out.println(info);
}
}

/scanFiles/src/com/b510/scanFiles/client/Client.java

 /**
*
*/
package com.b510.scanFiles.client; import java.util.Scanner; import com.b510.scanFiles.dao.ScanFiles;
import com.b510.scanFiles.factory.ScanFilesFactory;
import com.b510.scanFiles.utils.CommonUtil;
import com.b510.scanFiles.utils.PrintUtil; /**
* The Client class,User can input some content in the console.<br>
* and the system will monitoring the console and get the content and process it.
* @author Hongten
* @created Feb 12, 2014
*/
public class Client { private Scanner inputStreamScanner;
private boolean controlFlag = false; public static void main(String[] args) {
Client client = new Client();
client.monitoringConsoleAndHandleContent();
} public Client() {
inputStreamScanner = new Scanner(System.in);
} /**
* This is a monitor,which can monitoring the console and handle the input content.
*/
public void monitoringConsoleAndHandleContent() {
PrintUtil.printInfo(CommonUtil.DESCRIPTION);
try {
while (!controlFlag && inputStreamScanner.hasNext()) {
processingConsoleInput();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeScanner();
}
} private void closeScanner() {
inputStreamScanner.close();
} /**
* Processing the content that user inputed.
*/
private void processingConsoleInput() {
String inputContent = inputStreamScanner.nextLine();
if (!inputContent.isEmpty()) {
controlFlag = exit(inputContent);
if (!controlFlag) {
notExit(inputContent);
}
}
} /**
* When the user input the keyword <code>"exit"</code>(ignore case),then the system will be exit.
* @param inputContent
*/
private boolean exit(String inputContent) {
if (CommonUtil.EXIT.equalsIgnoreCase(inputContent)) {
controlFlag = true;
systemExit();
}
return controlFlag;
} /**
* System.exit(0);
*/
private void systemExit() {
PrintUtil.printInfo(CommonUtil.EXIT_SYSTEM);
System.exit(0);
} /**
* different with the method "exit()"
* @param inputContent
*/
private void notExit(String inputContent) {
String[] inputs = inputContent.split(CommonUtil.BLANK);
if (null != inputs && inputs.length >= CommonUtil.TWO) {
//the factory of the proxy
ScanFiles factory = ScanFilesFactory.getInstance(inputs);
if (CommonUtil.CD.equalsIgnoreCase(inputs[0])) {
factory.handleCD(inputs);
} else {
factory.scan(inputs);
}
} else {
PrintUtil.printInfo(CommonUtil.INCORRECT_INPUT_FORMAT);
}
}
}

===========================================

Original Source Doaload:  http://files.cnblogs.com/hongten/scanFiles.zip

===========================================

========================================================

More reading,and english is important.

I'm Hongten

大哥哥大姐姐,觉得有用打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。谢谢。
Hongten博客排名在100名以内。粉丝过千。
Hongten出品,必是精品。

E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten

========================================================

原创Java版的Shell的更多相关文章

  1. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  2. Jaeger的客户端采样配置(Java版)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. java版的类似飞秋的局域网在线聊天项目

    原文链接:http://www.cnblogs.com/wangleiblog/articles/5323305.html 转载请注明 最近在弄一个java版的局域网在线聊天项目,功能跟飞秋差不多.p ...

  4. 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

    常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

  5. 微博excel数据清洗(Java版)

    微博数据清洗(Java版) 原创 2013年12月10日 10:58:24 2979 大数据公益大学提供的一份数据,义务处理一下,原始数据是Excel,含有html标签,如下:   要求清洗掉html ...

  6. java版gRPC实战之一:用proto生成代码

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. java版gRPC实战之二:服务发布和调用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. java版gRPC实战之三:服务端流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. java版gRPC实战之四:客户端流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. HDOJ 1312 DFS&BFS

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  2. /var/lock/subsys作用

    转自: http://sunxiaqw.blog.163.com/blog/static/9906543820111184422807/ 关于/var/lock/subsys目录 总的来说,系统关闭的 ...

  3. 查看一些特定sql需求的书写

    user表,5个人abcde,  content表10篇文章,一个人对应两篇文章,有 time字段,查询出五个人的最新文章. select a.id,a.SName,a.ClsNo,a.Scorefr ...

  4. 18.用两个栈实现队列[2StacksToImplementQueue]

    [题目] 某队列的声明如下:  C++ Code  123456789101112131415   template<typename T> class CQueue { public: ...

  5. 转数据库分库分表(sharding)系列(二) 全局主键生成策略

    本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...

  6. Java性能优化权威指南-读书笔记(五)-JVM性能调优-吞吐量

    吞吐量是指,应用程序的TPS: 每秒多少次事务,QPS: 每秒多少次查询等性能指标. 吞吐量调优就是减少垃圾收集器消耗的CPU周期数,从而将更多的CPU周期用于执行应用程序. CMS吞吐调优 CMS包 ...

  7. COURSES(poj 1469)

    题意: 给你p门课程和n个学生,一个学生可以选0门,1门,或者多门课程,现在要求一个由p个学生组成的集合,满足下列2个条件: 1.每个学生选择一个不同的课程 2.每个课程都有不同的代表 如果满足,就输 ...

  8. Mybatis if判断的坑

    具体情况参考这两篇文章: http://cheng-xinwei.iteye.com/blog/2008200 http://www.cnblogs.com/tv151579/p/3297691.ht ...

  9. 调试工具GDB详解

    1 简介 2 生成调试信息 3 启动GDB 的方法 4 程序运行上下文 4.1 程序运行参数 4.2 工作目录 4.3 程序的输入输出 5 设置断点 5.1 简单断点 5.2 多文件设置断点 5.3 ...

  10. .NET委托解析

    委托这个概念其实我们都很熟悉了,但是在使用的时候很多人还是无法去把控它,我们可以试想一下,在平时编码的时候,你是直接按照业务逻辑直接创建类,new出一个对象来进行操作的还是说有用到委托来更高效的完成一 ...