从事互联网金融,常常会碰到文件处理,以前都是傻傻的解析,这次我不想这么傻了,做个小小的封装,咱也以oop的思想来完成。

文件解析处理一般分两种模式:分隔符与定长,目前工作五年也就这两种。

封装思想:

  1. 分隔符模式采用反射转换为对象
  2. 室长模式采用反射加注解转换为对象
 package anno;

 import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author wujf 文件转对象注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
public @interface Fto {
String desc() default ""; int len() default 0;
}

注解定义

 package anno;

 import java.lang.reflect.Field;

 public class FtoAnnoImp {

     /**
* 根据分隔符转换
*
* @param str
* @param split
* @param cls
* @return
* @throws Exception
*/
public static Object parseWithSplit(String str, String split, Class cls) throws Exception {
Object obj = cls.newInstance();
Field[] fields = cls.getDeclaredFields();
String[] tem = str.split(split);
for (int i = 0; i < tem.length; i++) {
fields[i].set(obj, tem[i]);
}
return obj;
} /**
* 根据定长转换
*
* @param str
* @param cls
* @return
* @throws Exception
*/
public static Object parseWithLen(String str, Class cls) throws Exception {
Object obj = cls.newInstance();
Field[] fields = cls.getDeclaredFields();
Fto fto;
int idx = 0;
for (int i = 0; i < fields.length; i++) {
fto = fields[i].getAnnotation(Fto.class);
int len = fto.len();
fields[i].set(obj, str.substring(idx, idx + len));
idx = idx + len;
}
return obj;
}
}

注解解析

下面上一段测试代码

 package anno;

 public class FtoObj {

     @Fto(desc = "AA", len = 2)
public String A;
@Fto(desc = "BB", len = 2)
public String B; @Override
public String toString() {
return "FtoObj [A=" + A + ", B=" + B + "]";
} }

对象定义

 package anno;

 /**
* @author
*/
public class TestFto {
public static void main(String[] args) throws Exception {
String s = "32123234234123412,fsjkadfjdkasjf";
FtoObj obj = (FtoObj) FtoAnnoImp.parseWithSplit(s, ",", FtoObj.class);
System.out.println(obj.toString());
s = "1234";
obj = (FtoObj) FtoAnnoImp.parseWithLen(s, FtoObj.class);
System.out.println(obj.toString());
}
}

后续建议

1、由于文件一行行读取,因此建议读取的结果建议放在一个list里,list定义如下哦!(如果是大文件,记得分多次转list,不然内存有压力的)

 package anno;

 import java.util.List;

 public class FtoList {
public int lineNo;
public List<Object> object;
}

list定义

2、注解里可以定义的更加丰富,比如支持类型(int、date),目前写的简单,统一当字符串处理了,后续业务处理还可能涉及类型转换

最新文章

  1. JSPatch热更新的利器.
  2. DOM操作方法的简单归纳
  3. Altium Designer 多个输出相连等问题报错解决方法
  4. nginx“虚拟目录”不支持php的解决办法
  5. web api 2 学习笔记 (Odata ODataQueryOptions 使用)
  6. LFS,编译自己的Linux系统 - 准备分区
  7. JS中格式化数据保留两位小数
  8. LPCTSTR
  9. iscroll实现移动端下拉刷新,上拉加载更多
  10. oracle登陆,在监听服务启动了的情况下,登陆用户还是报错未启动监听服务的错误(刚开始装oracle是能登陆的,重启之后装了plsql)
  11. css设置层级显示
  12. umask的作用[转]
  13. WordPress评论时一键填入昵称、邮箱和网址
  14. Web开发技术的演变
  15. 新版MATERIAL DESIGN 官方动效指南(一)
  16. dpkg用管道批量删除deb
  17. C语言学习快速笔记
  18. zyb的面试
  19. wget: command not found
  20. FFMPEG转换WAV到MP3

热门文章

  1. Spring-AOP和AspectJ的区别和联系
  2. 赋值容器winform 根据NAME查找控件
  3. 怎样配置Tomcat环境变量
  4. makefile中的patsubst
  5. ios开发——常用经典算法OC篇&amp;冒泡/快速
  6. iOS开发——Metal教程
  7. 描述cookie,sessionstroage,localstrage的区别
  8. yum.pid 已被锁定
  9. Sky number
  10. cocos2d-x中使用json