import org.springframework.util.ReflectionUtils;
import java.io.*;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;
public class FileLoder{
/**
*按行读取txt文件并返回一个List<String>集合
*@param path
*@return List<String>
*/
public static List<String> getFileContent(String path,String enccdingType)throws Exception {
List<String> strList = new ArrayList(~>();
File file = new File(path);
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
FileInputStream fileInputStream= null;
try {
fileInputStream = new FileInputStream(file);
//将字节流向字符流转换
inputStreamReader = new InputStreamReader(fileInputStream, encodingType);
//创建字符流缓冲区
bufferedReader = nevw BufferedReader (inputStreamReader);
String line;
//按行读取
while ((line = bufferedReader.readLine()) != null) {
strlist.add(line);
}catch(Exception e)
e.printStackirace();
}finally{
if(bufferedReader != null){
try{
bufferedReader.close();
} catch(IOException e){
e.printStackirace()
}
}
if(inputStreamReader !=null){
try{
inputStreamReader.close();
} catch(IOException e){
e.printStackirace()
}
}
if(fileInputStream !=null){
try{
fileInputStream.close();
} catch(IOException e){
e.printStackirace()
}
}
}
}
/**
*@Description 将数组转换为对象
*@param class 对象
*@param argas 数组
*@return T
*/
public static<T> T setParam(Class<I> clazz, Object[] args) throws Exception {
if (clazz == null || args == null) {
throw new IllegalArgumentException();
}
T t = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
if (fields == null || fields.length > args.length+1){
throw new IndexOutOfBoundsException();
}
for (int i= 0; i< fields.length; i++)
ReflectionUtils.makeAccessible(fields[i]);
if(fields[i].getType().toString().contains("Integer")){
fields[i].set(t,Integer.valueOf(args[i].toString().equal("")?"0":args[i].toString()));
}else if(fields[i].getIype().toString().contains("BigDecinal")){
fields[i].set(t,new BigDecimal(args[i].toStzing().equals("")?"0":args[i].toString()));
}else{
fields[i].set(t,args[i]);
}
}
return t;
}
/**
*使用StringTokenizer类将字符串安分隔符转换成数组
*@param string 字符串
*@param divisionChar 分隔符
*@return 字符串数组
*/
public static String[] stringAnalytical(String string, String divisionChar){
int i=0;
StringTokenizer tokenizer = new StringTokenizer(string, divisionChar);
Stzing[] str = newString[tokenizer.countTokens()];
while(tokenizer.hasMoreTokens()){
str[i] = new String();
str[i] = tokenizer.nextToken();
i++;
}
return str;
}
/**
*使用StringTokenizer类将字符串按int数组长度转换成数组
*@Param str 字符串 ints 字符串长度数组
*@Return 字符串数组
*/
public static String[] stringAnalytical(String str, int[] ints) throws Exception{
String[] strs = null;
List<String> stringList = new ArrayList();
for(int i = 0;i < ints.length;i++)(
String strn= CutString.bSubstring(str,ints[i]);
if(il=ints.length-1){
str = str.substring(strn.length());
str = str.substring(1);
}
stringList.add(strn);
}
strs = stringList.toArray(new String[0]);
return strs;
}
/**
*@Description 将文件按分隔符读取到List<Objiect> 对象集合
*@Param path 文件全路径 fgf 分隔符 class 对象.class encodingType 编码格式
*@Return List<T> 对象集合
*/
public static <T> List<T> FileToList(String path,String fgf,Class<T> class,String encodingType) throws Exception{
List<String> strlist = FileLoder.getFileContent(path,encodingType);
List<T> list = new ArrayList<>();
for(String str1 : strlist){
String[] strz = FileLoder.stringAnalytical(str1,fgf);
T Object = FileLoder.setParam(class,strz);
list.add(Object );
}
return list;
}
/**
*@Description 将文件按各字段定长读取到List<Objiect> 对象集合
*@Param path 文件全路径 ints 各字段长度数组 class 对象.class encodingType 编码格式
*@Return List<T> 对象集合
*/
public static <T> List<T> FileToList(String path,int[] ints,Class<T> class,String encodingType) throws Exception{
List<String> strlist = FileLoder.getFileContent(path,encodingType);
List<T> list = new ArrayList<>();
for(String str1 : strlist){
String[] strz = FileLoder.stringAnalytical(str1,ints);
T Object = FileLoder.setParam(class,strz);
list.add(Object );
}
return list;
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class CutString{
/**按字节截取字符串
*@param s 原始字符串
*@param length 截取的字节长度
*@return 截取后的字符串
*/
public static String bSubstring(String s, int length) throws Exception{
byte[] bytes = s.getBytes("Unicode");
int n = 0;// 表示当前的字节数
int i= 2;// 要截取的字节数,从第3个字节开始
for (;i < bytes.length && n < length;i++){
//奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节
if (i % 2 == 1){
n++;// 在UCS2第二个字节时n加1
}else{
//当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节
if(bytes[i] != 0){
n++;
}
}
//如果i为奇数时,处理成偶数
if(i%2 == 1){
//该UCS2字符是汉字时,去掉这个截掉一半的汉字
if(bytes[i-1]!=0){
i=i-1;
}else{
//该UC52字符是字母胶装字,保雪该学符
i=i+1;
}
}
return new String(bytes,0,i,"Unicode");
}
}