实现思路
1.分割数据:从文件中截取每一段以某字符结尾的数据,可以将该将文件中的数据与分割字符串读取到字符串数组中,循环文字字符数组同时与字符串数组进行对比。如连续几个字符全部满与字符串数组相同则满足截取条件。
2.执行操作:因所执行的操作可能与具体的业务有关,不同的业务有不同的操作因此此处采用策略模式来实现
实现代码
import java.io.*;
public class Utils {
public static void main(String[] args) {
String fileName = "D:\\xxx.xml";
String splitTag ="</Xml>";
//读取并打印
captureStringFromFileAndDoSomeProcessin(fileName, splitTag,new OperatePrint());
}
/**
* 从文件中截取以 某标签 结尾的每一条字符串,并对该字符执行某操作
* @param fileName 文件路径
* @param splitTag 截取标签
* @param operate 执行的操作, 采用策略模式
*/
public static void captureStringFromFileAndDoSomeProcessin(String fileName, String splitTag,Operate operate) {
File file= new File(fileName);
Reader reader = null;
try {
// 一次读多个字符
char[] tempchars = new char[1024];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(file));
StringBuilder stringBuilder = new StringBuilder();
char[] splitArrs = splitTag.toCharArray();
int splitArrsIndex =0;
while ((charread = reader.read(tempchars)) != -1) {
for(int i = 0;i< charread ;i++){
stringBuilder.append(tempchars[i]);
// 如果数组中的当前元素等于 分割符数组的第一位则循环对比接下来的每一位 全部满足则执行所需操作,有一个不符合则接着重新循环
// 此处需考虑到 当前缓存数组已循环完但分割符数组 还没有完成的情况
if(splitArrsIndex != 0 || tempchars[i] == splitArrs[0]){
while (i < charread && tempchars[i] == splitArrs[splitArrsIndex]){
if(splitArrsIndex == splitArrs.length-1){
operate.execute(stringBuilder.toString());
splitArrsIndex = 0;
stringBuilder = new StringBuilder();
break ;
}
i++;splitArrsIndex++;
if( i < charread ) stringBuilder.append(tempchars[i]);
}
}
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(reader != null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
策略接口
public interface Operate<T> {
boolean execute(T t);
}
具体策略如对该数据进行打印
public class OperatePrint implements Operate<String> {
@Override
public boolean execute(String s) {
System.out.println(s);
return false;
}
}