首先定义一个回调接口:
接口输入参数采用动态参数,方便灵活
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();
}
}
}
}
分享到:
相关推荐
首先,算子变量递归识别技术的基础在于递归下降解析(Recursive Descent Parsing),这是一种自顶向下的解析方法,它通过定义一系列的非终结符和终结符(对应于语言中的语法规则和词汇)来构建解析过程。在处理复合...
我们可以创建一个递归方法,接受当前节点作为参数,解析其子节点,将每个子节点转换为业务对象,并添加到父节点的子节点列表中。如果子节点还有子节点,继续调用递归函数,直到所有层次都被遍历。 5. 最后,根节点...
iBatis则是一个SQL映射框架,它将数据库操作与业务逻辑分离,允许开发者编写SQL语句而不必担心如何与Java代码集成。在Spring+iBatis的组合中,iBatis作为一个数据访问对象(DAO)框架,负责执行数据库查询和更新操作...
缓存服务器不仅负责递归解析还负责授权解析,这种部署方式提高了DNS服务的可用性和性能。 第二阶段(2008-2010年):随着3G移动网络的部署和固网宽带的发展,DNS部署开始考虑安全性问题,实现授权节点和递归节点的...
事务的传播行为定义了事务边界与方法调用的关系。隔离级别定义了事务之间相互隔离的程度,以防止并发问题的发生。 Struts1是基于MVC模式的Web应用程序框架,主要使用Action类处理业务逻辑,然后通过JSP页面显示结果...
这个框架遵循MVC(Model-View-Controller)设计模式,将业务逻辑、数据处理和用户界面分离,使得代码更易于维护和扩展。它提供了诸如路由、模型、视图、控制器、中间件、服务容器等一系列工具,极大地提高了开发效率...
在实际应用中,为了实现这种功能,我们需要在Struts的Action中编写处理递归逻辑的方法,并确保返回的数据结构适合前端JavaScript解析。同时,前端需要有合适的JavaScript库或自定义函数来处理接收到的数据,并动态地...
可以使用递归方法或者DFS(深度优先搜索)/BFS(广度优先搜索)算法来构建树。 3. 数据传递: 将构建好的树形数据结构转化为JSON对象,然后通过HTTP响应发送到前端。在JSP页面中,使用JavaScript(例如jQuery或Vue...
8. **三层架构**:通常指表示层、业务逻辑层和数据访问层,用于分离界面展示、业务处理和数据存储。 9. **MVC模式**:Model-View-Controller,一种用于构建可维护和可测试的Web应用的架构模式。 10. **装箱与拆箱*...
本文将深入探讨如何使用PHP实现省市区地址的分离算法,并分享省市区的数据结构与处理方法。 首先,我们需要理解省市区数据的存储方式。通常,这类数据会被组织成树状结构,每个节点代表一个行政区域,例如国家、...
在MVC基础上增加层,如服务层(Service Layer),可以进一步分离业务逻辑,提高代码复用性和模块化。 以上是基于题目给出的知识点的详细解析,涵盖了计算机图形学、数据类型转换、编程语言特性、数据库系统、Web...
ASP.NET 初级程序员面试题涉及了多个核心概念和技术,以下是对这些知识点的详细解析: 1. 访问修饰符:`private`、`protected`、`public`、`internal`是C#中的访问控制修饰符,它们决定了类成员的可见性。 - `...
31. 遍历XML文件:使用递归解析XML节点,访问FileName属性。 32. SQL语句:使用OFFSET和FETCH子句获取指定范围记录。 33. 面向对象的特性:封装、继承、多态。 34. foreach遍历:需要实现IEnumerable接口或定义...
这通常涉及到递归或迭代算法,通过遍历树结构找到与路径相匹配的节点,并填充其相关信息。 在具体实现上,我们可能会定义一个切面,该切面拦截所有需要处理路径参数的方法。在方法执行前,利用路径参数解析出各个...
控制器类将处理HTTP请求,并调用业务逻辑方法。 2. **@RequestMapping**:此注解用于映射HTTP请求到特定的方法。可以放在类级别或方法级别,用于匹配URL模式。 3. **@GetMapping, @PostMapping, @PutMapping, @...
- 将验证逻辑与业务逻辑分离,保持代码整洁。 - 利用分组验证,根据业务场景选择执行的验证规则。 - 使用自定义注解扩展验证能力,避免重复代码。 总结来说,Hibernate Validator 是一个强大且灵活的验证工具,...
`lisFile`方法是一个递归函数,用于遍历指定目录`sinosoft`下的所有子目录和.java文件。它首先判断给定的路径是否为目录,如果是,就获取其下所有文件和子目录,再分别处理文件(检查是否为.java文件)和子目录...
DAO(Data Access Object)模式是一种设计模式,用于封装对数据库的所有操作,使其与业务逻辑分离,提高代码的可测试性和可维护性。`Impl`通常表示“实现”,意味着这是一个具体实现了抽象接口或抽象类的实例,负责...