论坛首页 Java企业应用论坛

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

浏览 1194 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-18  
首先定义一个回调接口:
接口输入参数采用动态参数,方便灵活
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企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics