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

1 篇文章 0 订阅
1 篇文章 0 订阅
首先定义一个回调接口:
接口输入参数采用动态参数,方便灵活

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();
}
}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值