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