`
goodscript
  • 浏览: 71986 次
  • 性别: 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();
			}
		}

	}

}

分享到:
评论

相关推荐

    超级有影响力霸气的Java面试题大全文档

     Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...

    java 面试题 总结

    Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    全书分6篇共25章,主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程技术、数据结构与算法、Windows窗体基础、特色窗体界面、窗体控制技术、MDI窗体和继承窗体、Windows...

    代码之美(中文完整版).pdf

    17.5. 复用与分离 17.6.分层是永恒之道? 第18章 Python的字典类:如何打造全能战士 18.1. 字典类的内部实现 18.2. 特殊调校 18.3. 冲突处理 18.4. 调整大小 18.5. 迭代和动态变化 18.6. 结论 18.7. 致谢 第19章 ...

    万能后台管理模板javaweb

    3. 菜单管理:无限级别自定义菜单,自定义菜单图标,业务菜单和系统菜单分离,菜单状态显示隐藏(递归处理) 4. 数据字典:无限级别,支持多级别无限分类。内设编号,排序等 5. 组织机构:无限级别,公司or部门管理 ...

    JAVA上百实例源码以及开源项目源代码

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    JAVA上百实例源码以及开源项目

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    java源码包---java 源码 大量 实例

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    java源码包2

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    java源码包3

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    java源码包4

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    入门学习Linux常用必会60个命令实例详解doc/txt

    这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...

    JAVA核心知识点整理(有效)

    2.2.3. 本地方法区(线程私有) ................................................................................................................ 23 2.2.4. 堆(Heap-线程共享)-运行时数据区 .....................

Global site tag (gtag.js) - Google Analytics