从文件中读取每一段以某字符串结尾的数据,并执行某些操作

实现思路

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值