日常開發中經常碰到一些需要對文件處理的需求。一般有可能是過濾、解析裏邊指定字段然後存儲在指定的集合結構中;又或者是對每行數據做一些操作。這些東西常常是大同小異。因此嘗試封裝了一個簡單的工具類,用於減少重複代碼,只寫自己的業務邏輯。
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));
}
}