小白のjava实现wc.exe功能
GitHub地址
项目完成情况
基本功能列表(已实现)
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的词的数目
wc.exe -l file.c //返回文件 file.c 的行数
扩展功能(已实现)
-s 递归处理目录下符合条件的文件。
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
[file_name]: 文件或目录名,可以处理一般通配符。
高级功能(未实现)
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
需求举例:
wc.exe -s -a *.c 返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。
PSP2.1表格预估

解题思路
用java实现wc.exe文件:实现3个基本功能,必须通过输入流接收文件内容。实现“-s”扩展功能,则需要通过递归,将文件名存入字符串列表,之后循环输出。实现“-a”扩展功能,我的思路是用readLine()方法将源文件一行一行接收,然后通过条件语句判断;而判断的顺序是:先判断是否是空行,再判断是否为注释行,除去这两种,剩下的就都是代码行了。
代码说明
统计字符数方法:countCharacter()
filePath:文件路径
用BufferedReader中的read()方法读取字符并进行判断:是否为可以用键盘键入的字符【ASCII码大于等于32,且不等于127(DEL)】,如果是,字符数加1。
public void countCharacter(String filePath) throws IOException {
int character=0;
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gb2312"));
int i;
while(-1!=(i=br.read()))
if(i>=32&&i!=127) character++;//只计入键盘输入的字符
br.close();
System.out.println("字符数:"+character);
}
统计行数方法:countLine()
filePath:文件路径
用BufferedReader中的readLine()方法读取每行字符,每读取一行,行数加1。
public void countLine(String filePath) throws IOException {
int line=0;
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gb2312"));
while(null!=br.readLine()) line++;
br.close();
System.out.println("行数:"+line);
}
统计单词数方法:countWord()
filePath:文件路径
用BufferedReader中的readLine()方法读取一行字符并存入str中,然后用replaceAll()方法将字符串中,非字母、单引号(')、下划线(_)、连接符(-)的字符替换成空格,再用split()分隔成字符串数组,统计数组中包含字母的字符串的数目即为该行字符的单词数,循环该流程得出整个源文件的单词数。
public void countWord(String filePath) throws IOException {
int word=0;
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gb2312"));
String str="";
while(null!=(str=br.readLine())){
str=str.replaceAll("[^A-Za-z'_-]"," "); //将不是字母、单引号、下划线、连接符的字符替换成空格
for(String s:str.split(" ")) //用空格分隔字符串
if(Pattern.matches(".*[A-Za-z]+.*",s)) word++; //字符串包含字母,就算是单词
}
br.close();
System.out.println("单词数:"+word);
}
统计代码行、空行、注释行:getCount()
filePath:文件路径
用BufferedReader中的readLine()方法读取每行字符并用replaceAll()方法,将非字母、斜杠(/)、星号(*)的字符都换成空字符,再存入字符串数组中。遍历字符串数组判断归类为代码行、空行、注释行:空字符串即为空行;以双斜杠(//)开头,或(/*)开头(*/)结尾之间的字符串都为注释行;剩下的就是代码行了。
public void getCount(String filePath) throws IOException {
int codeLine=0,blankLine=0,commentLine=0;
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gb2312"));
String str="";
List<String> strs=new ArrayList<String>();
boolean sign=false;
while(null!=(str=br.readLine()))
strs.add(str.replaceAll("[^A-Za-z/*]",""));
for(int i=0;i<strs.size();i++){
//空行
if(strs.get(i).equals("")&&sign==false) blankLine++;
//单行注释
else if(strs.get(i).startsWith("//")&&sign==false) commentLine++;
//多行注释
else if(strs.get(i).startsWith("/*")||sign==true){
commentLine++;
sign=true;
} else if(strs.get(i).endsWith("*/")&&sign==true){
commentLine++;
sign=false;
}
//代码行
else codeLine++;
}
System.out.println("代码行:"+codeLine);
System.out.println("空行:"+blankLine);
System.out.println("注释行:"+commentLine);
br.close();
}
递归获取目录下符合条件的文件
file:以文件夹路径实例化的File实例
paths:用于存文件路径的字符串数组
flag:要获取的文件的格式
返回结果:存有获取文件的路径的字符串数组
遍历file通过listFiles()方法提取出的File数组,用path接收File数组每个File元素的路径。判断路径是否以文件格式flag结尾:是就加入字符串数组paths;否则就判断路径是否是目录路径,是就通过递归执行该方法。
public List<String> getFiles(File file,List<String> paths,String flag) {
File[] files=file.listFiles();
if(null==files) return paths;
for(File f:files){
String path=f.getPath();
if(path.endsWith(flag)) paths.add(path);
if(f.isDirectory()) getFiles(f,paths,flag);
}
return paths;
}
测试运行
a.java为空文件

a.java为一个源文件
a.java1 /*******************************************************
Hello World
*******************************************************/
public void main(String[] args) {
//HelloWorld.java
System.out.println("HelloWorld");//HelloWorld.java
}

查找D盘下所有以.java结尾的文件

项目小结
这是我第一次这么系统地完成一个项目。以前都是读完题目要求就直接敲代码,并没有去进行详细地分析,也没有计时。而现在能清楚地看到自己做一个项目所花的时间要比自己预估的时间要长,这点就必须改进,而且要学会更好地判断预估自己的能力。
而在测试过程中发现在递归查找文件的算法耗时较多,不过目前没有较好的解决方案,期待日后能得以解决。
----------码场小白,求轻喷T T----------
小白のjava实现wc.exe功能的更多相关文章
- JAVA实现WC.exe功能
项目要求 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能要求: 程序处理用户需求的模式为: wc.exe [paramet ...
- 软件工程:Java实现WC.exe基本功能
项目相关要求 GitHub地址:https://github.com/3216004716/WC 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处 ...
- 用c语言基本实现wc.exe功能
网址:https://github.com/3216005214/wc.exe wc项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿 ...
- java实现wc.exe
Github地址:https://github.com/ztz1998/wc/tree/master 项目相关要求 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功 ...
- 软工作业No.1。Java实现WC.exe
网址:https://github.com/a249970271/WC WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有w ...
- Java 实现 WC.exe
Github:https://github.com/YJOED/Code/tree/master/WC/src 一.题目:实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他 ...
- Java实现WC基本功能
GitHub仓库:https://github.com/douyazai/WCbase 一.WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命 ...
- 软工作业1—java实现wc.exe
github项目地址 https://github.com/liyizhu/wc.exe WC 项目要求 基本功能列表: wc.exe -c file.c //返回文件 file.c 的字符数 ...
- Java实现wc部分功能
GitHub仓库:https://github.com/TaoTaoLv1/WcProject 一.开发前PSP表格预估* PSP2.1 Personal Software Process Stage ...
随机推荐
- elasticsearch之分词插件使用
elasticsearch对英文会拆成单个单词,对中文会拆分成单个字.下面来看看是不是这样. 首先测试一下英文: GET /blog/_analyze { "text": &quo ...
- IPV6配置
云友“学渣王 ”在帖子里提到需要为阿里云ECS配置IP6地址,根据网上的一些信息,写此例. 如果要求是FQDN地址,请登录到您的域名控制面板,设置一条AAAA记录到新设置的IPv6隧道地址. 在阿 ...
- vue学习目录 vue初识 this指向问题 vue组件传值 过滤器 钩子函数 路由 全家桶 脚手架 vuecli element-ui axios bus
vue学习目录 vue学习目录 Vue学习一之vue初识 Vue学习二之vue结合项目简单使用.this指向问题 Vue学习三之vue组件 Vue学习四之过滤器.钩子函数.路由.全家桶等 Vue学习之 ...
- jmeter 入门学习-通过代理录制测试脚本
通过jmeter代理录制脚本后,会产生大量的无用的请求,尽管在代理中已经过滤了一部分图片或者CSS.JS文件. 手动查看主要的请求:这里主要关注登陆请求,要确定有效的URL请求 删除除/Login.a ...
- EL表达式JSTL
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据. 语法:${隐式对象名称}:获得对象的引用 序号 隐含对象名称 描 ...
- Sybase IQ 的基础
Sybase IQ 的基础 Sybase IQ的一些基础总结: 1.IQ跟其它的关系型数据库相比,它的主要特征是:查询快.数据压缩比高.Load快,但是插入更新慢,不太适应数据老是变化,它是按列存 ...
- React.createClass和extends Component的区别
React.createClass和extends Component的区别主要在于: 语法区别 propType 和 getDefaultProps 状态的区别 this区别 Mixins 语法区别 ...
- Linux - ansible 安装
# 安装依赖 yum install rpm-build python2-devel sshpass PyYAML python-jinja2 python-paramiko python-six p ...
- 使用tortoisegit工具git地址中带号码密码的拉取,以及使用这种方式后中途重置密码报git remote: HTTP Basic: Access denied 错误解决办法
1. 在拉取git项目时可以在地址中直接指定号码密码如下就可以直接拉取下来 https://username:password@github.com 需要注意,因为在解析地址时是以@符号作为地址信 ...
- linux获取网络信息函数
获取IP地址 int sys_getIP(char *ip_addr) { ] = {"ifconfig eth0 | grep inet | cut -d: -f2 | cut -d' ' ...