`
goodscript
  • 浏览: 72925 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

与业务分离的递归解析方法

阅读更多
首先定义一个回调接口:
接口输入参数采用动态参数,方便灵活
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();
			}
		}

	}

}

分享到:
评论

相关推荐

    行业分类-外包设计-基于算子变量递归识别技术的复合表达式智能解析方法的说明分析.rar

    首先,算子变量递归识别技术的基础在于递归下降解析(Recursive Descent Parsing),这是一种自顶向下的解析方法,它通过定义一系列的非终结符和终结符(对应于语言中的语法规则和词汇)来构建解析过程。在处理复合...

    spring+ibatis+jDom递归生成

    我们可以创建一个递归方法,接受当前节点作为参数,解析其子节点,将每个子节点转换为业务对象,并添加到父节点的子节点列表中。如果子节点还有子节点,继续调用递归函数,直到所有层次都被遍历。 5. 最后,根节点...

    Spring+iBatis+JDom递归生成XML树

    iBatis则是一个SQL映射框架,它将数据库操作与业务逻辑分离,允许开发者编写SQL语句而不必担心如何与Java代码集成。在Spring+iBatis的组合中,iBatis作为一个数据访问对象(DAO)框架,负责执行数据库查询和更新操作...

    DNS发展简介

    缓存服务器不仅负责递归解析还负责授权解析,这种部署方式提高了DNS服务的可用性和性能。 第二阶段(2008-2010年):随着3G移动网络的部署和固网宽带的发展,DNS部署开始考虑安全性问题,实现授权节点和递归节点的...

    12-java软件工程师(初级)笔试题.pdf

    事务的传播行为定义了事务边界与方法调用的关系。隔离级别定义了事务之间相互隔离的程度,以防止并发问题的发生。 Struts1是基于MVC模式的Web应用程序框架,主要使用Action类处理业务逻辑,然后通过JSP页面显示结果...

    基于ThinkPHP5 三层分销

    这个框架遵循MVC(Model-View-Controller)设计模式,将业务逻辑、数据处理和用户界面分离,使得代码更易于维护和扩展。它提供了诸如路由、模型、视图、控制器、中间件、服务容器等一系列工具,极大地提高了开发效率...

    ajax+struts

    在实际应用中,为了实现这种功能,我们需要在Struts的Action中编写处理递归逻辑的方法,并确保返回的数据结构适合前端JavaScript解析。同时,前端需要有合适的JavaScript库或自定义函数来处理接收到的数据,并动态地...

    动态生成菜单树

    可以使用递归方法或者DFS(深度优先搜索)/BFS(广度优先搜索)算法来构建树。 3. 数据传递: 将构建好的树形数据结构转化为JSON对象,然后通过HTTP响应发送到前端。在JSP页面中,使用JavaScript(例如jQuery或Vue...

    .net面试题

    8. **三层架构**:通常指表示层、业务逻辑层和数据访问层,用于分离界面展示、业务处理和数据存储。 9. **MVC模式**:Model-View-Controller,一种用于构建可维护和可测试的Web应用的架构模式。 10. **装箱与拆箱*...

    php省市区详细地址分离算法及省市区数据

    本文将深入探讨如何使用PHP实现省市区地址的分离算法,并分享省市区的数据结构与处理方法。 首先,我们需要理解省市区数据的存储方式。通常,这类数据会被组织成树状结构,每个节点代表一个行政区域,例如国家、...

    面视题面视需要

    在MVC基础上增加层,如服务层(Service Layer),可以进一步分离业务逻辑,提高代码复用性和模块化。 以上是基于题目给出的知识点的详细解析,涵盖了计算机图形学、数据类型转换、编程语言特性、数据库系统、Web...

    asp.net初级程序员面试题

    ASP.NET 初级程序员面试题涉及了多个核心概念和技术,以下是对这些知识点的详细解析: 1. 访问修饰符:`private`、`protected`、`public`、`internal`是C#中的访问控制修饰符,它们决定了类成员的可见性。 - `...

    ASP.NET面试题目

    31. 遍历XML文件:使用递归解析XML节点,访问FileName属性。 32. SQL语句:使用OFFSET和FETCH子句获取指定范围记录。 33. 面向对象的特性:封装、继承、多态。 34. foreach遍历:需要实现IEnumerable接口或定义...

    common_加入缓存AOP,树结构路径参数填充_.zip

    这通常涉及到递归或迭代算法,通过遍历树结构找到与路径相匹配的节点,并填充其相关信息。 在具体实现上,我们可能会定义一个切面,该切面拦截所有需要处理路径参数的方法。在方法执行前,利用路径参数解析出各个...

    SpringMVC纯注解配置

    控制器类将处理HTTP请求,并调用业务逻辑方法。 2. **@RequestMapping**:此注解用于映射HTTP请求到特定的方法。可以放在类级别或方法级别,用于匹配URL模式。 3. **@GetMapping, @PostMapping, @PutMapping, @...

    hibernate-validator

    - 将验证逻辑与业务逻辑分离,保持代码整洁。 - 利用分组验证,根据业务场景选择执行的验证规则。 - 使用自定义注解扩展验证能力,避免重复代码。 总结来说,Hibernate Validator 是一个强大且灵活的验证工具,...

    中科软科java面试

    `lisFile`方法是一个递归函数,用于遍历指定目录`sinosoft`下的所有子目录和.java文件。它首先判断给定的路径是否为目录,如果是,就获取其下所有文件和子目录,再分别处理文件(检查是否为.java文件)和子目录...

    SystemUserDAOImpl.rar_SystemUserDaoImpl_xml classification

    DAO(Data Access Object)模式是一种设计模式,用于封装对数据库的所有操作,使其与业务逻辑分离,提高代码的可测试性和可维护性。`Impl`通常表示“实现”,意味着这是一个具体实现了抽象接口或抽象类的实例,负责...

Global site tag (gtag.js) - Google Analytics