java基于函数作为参数的文本工具类

日常开发中经常碰到一些需要对文件处理的需求。一般有可能是过滤、解析里边指定字段然后存储在指定的集合结构中;又或者是对每行数据做一些操作。这些东西常常是大同小异。因此尝试封装了一个简单的工具类,用于减少重复代码,只写自己的业务逻辑。

import org.apache.commons.lang3.ArrayUtils;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by 51771 on 2019/5/21.
 */
public class FileUtil {
    /*
    解析一行数据中指定字段存储到map中
     */
    public interface Str2Map<T extends Map<String,String>,S extends String> {
         void run(T map,S str);
    }
    /*
    解析一行数据中指定字段存储到list中
     */
    public interface Str2List<T extends List<String>,S extends String> {
        void run(T map,S str);
    }
    /*
    解析一行数据,运行给定的方法
     */
    public interface Str2run<S extends String> {
        void run(S str);
    }
    /*
    按行读取文件存储成map,调用用户实现的Str2Map.run方法
     */
   public static Map<String,String> file2Map(String filePath,Str2Map<Map<String,String>,String> str2Map) {
       Map<String, String> ret = new HashMap<>();
       try {
           Files.lines(Paths.get(filePath))
                   .filter(line -> !"".equals(line.trim()))
                   .forEach(line -> {
                       str2Map.run(ret, line);
                   });
       } catch (IOException e) {
           System.out.printf("读取[%s]存储为map时报错\n",filePath);
           e.printStackTrace();
       }
       return ret;
   }
    /*
    按行读取文件存储成list,调用用户实现的Str2List.run方法
     */
    public static List<String> file2List(String filePath,Str2List<List<String>,String> str2List) {
        List<String> ret = new ArrayList<>();
        try {
            Files.lines(Paths.get(filePath))
                    .filter(line -> !"".equals(line))
                    .forEach(line -> {
                        str2List.run(ret, line);
                    });
        } catch (IOException e) {
            System.out.printf("读取[%s]存储为list时报错\n",filePath);
            e.printStackTrace();
        }
        return ret;
    }

    /*
    按行读取文件,运行指定的方法
     */
    public static List<String> file2run(String filePath,Str2run<String> str2run) {
        List<String> ret = new ArrayList<>();
        try {
            Files.lines(Paths.get(filePath))
                    .filter(line -> !"".equals(line))
                    .forEach(line -> {
                        str2run.run(line);
                    });
        } catch (IOException e) {
            System.out.printf("读取[%s]存储为list时报错\n",filePath);
            e.printStackTrace();
        }
        return ret;
    }

    public static void main(String[] args) {
        //读取文件存储成map演示示例
        List<String> test1 = file2List("E:\\domainName.txt",
            (List<String> list, String line) -> list.add(line.trim()));
        System.out.println(ArrayUtils.toString(test1));
        //读取文件存储成list演示示例
        Map<String,String> test2 = file2Map("E:\\provinceCode.txt"
                , (Map<String, String> map, String line) -> {
                    String[] lineArr = line.split("\t");
                    if (lineArr.length == 2) {
                        map.put(lineArr[0], lineArr[1]);
                    }
                }
        );
        System.out.println(ArrayUtils.toString(test2));
        //运行给定方法演示
        file2run("E:\\domainName.txt",
                (String line) -> System.out.println(line));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值