首先定义一个回调接口:
接口输入参数采用动态参数,方便灵活
import java.io.IOException;
public interface CallBack {
/**
* 接口有意设计成动态参数形式
* 调用更加灵活
* @param objs
* @throws IOException
*/
void execute(Object... objs) throws IOException;
}
实现递归过程
短短的15行代码就完成了文件夹的递归解析过程
整个历遍过程不涉及到任何业务代码、更好的分离业务逻辑和代码逻辑分类
import java.io.File;
import java.io.IOException;
public class FileHandler {
/**
* 递归解析java文件,然后再调用回归函数处理解析过程
* 如果是文件夹的是递归解析
* 整个历遍过程不涉及到任何业务代码、更好的分离业务逻辑和代码逻辑分类
* @param file
* @throws IOException
*/
public static void parseJavaFile(File file, CallBack callBack) throws IOException {
File[] listFile = null;
if (file.isDirectory()) {
listFile = file.listFiles();
} else {
callBack.execute(file);
return;
}
for (File f : listFile) {
if (f.isDirectory()) {
parseJavaFile(f, callBack);
} else {
callBack.execute(f);
}
}
}
}
测试
在文件夹D:\\htmlParse\\中存放一些包含有中文内容的文件(任何文件)
下面的实例会帮助你解析该文件夹下面的文件,并且把文件内所有的内容进行中文分词打印出来
当你的解析业务发生了变化
你现在需要重新实现parseFile方法
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.wltea.analyzer.IKSegmentation;
import org.wltea.analyzer.Lexeme;
/**
* 递归解析文件夹下所有文件
* 并对文件内容进行中文分词
* @author admin
*
*/
public class ParseFileExample {
private static List<String> list = new ArrayList<String>();
private static Pattern p = Pattern.compile("[\u4e00-\u9fa5]+?");
public static void main(String[] args) throws IOException {
File file = new File("D:\\htmlParse\\");
//通过回调函数的形式优雅的递归解析文件夹中的文件
FileHandler.parseJavaFile(file, new CallBack() {
public void execute(Object... objs) throws IOException {
parseFile((File) objs[0]);
}
});
System.out.println(list);
}
private static void addChar(String chars) {
if (!list.contains(chars)) {
list.add(chars);
}
}
/**
* 该方法更像是一个业务方法
* 如果你解析业务发生了变化,只需要改变这个方法就可以了
* @param file
*/
public static void parseFile(File file) {
Reader reader = null;
try {
reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
IKSegmentation iks = new IKSegmentation(reader);
while (true) {
Lexeme lex = null;
try {
lex = iks.next();
String lexeme = null;
if (lex != null) {
lexeme = lex.getLexemeText();
Matcher m = p.matcher(lexeme);
if (m.find()) {
addChar(lexeme);
}
}
if (lex == null)
return;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...
全书分6篇共25章,主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程技术、数据结构与算法、Windows窗体基础、特色窗体界面、窗体控制技术、MDI窗体和继承窗体、Windows...
17.5. 复用与分离 17.6.分层是永恒之道? 第18章 Python的字典类:如何打造全能战士 18.1. 字典类的内部实现 18.2. 特殊调校 18.3. 冲突处理 18.4. 调整大小 18.5. 迭代和动态变化 18.6. 结论 18.7. 致谢 第19章 ...
3. 菜单管理:无限级别自定义菜单,自定义菜单图标,业务菜单和系统菜单分离,菜单状态显示隐藏(递归处理) 4. 数据字典:无限级别,支持多级别无限分类。内设编号,排序等 5. 组织机构:无限级别,公司or部门管理 ...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...
这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...
2.2.3. 本地方法区(线程私有) ................................................................................................................ 23 2.2.4. 堆(Heap-线程共享)-运行时数据区 .....................