java小经验
从事互联网金融,常常会碰到文件处理,以前都是傻傻的解析,这次我不想这么傻了,做个小小的封装,咱也以oop的思想来完成。
文件解析处理一般分两种模式:分隔符与定长,目前工作五年也就这两种。
封装思想:
- 分隔符模式采用反射转换为对象
- 室长模式采用反射加注解转换为对象
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),目前写的简单,统一当字符串处理了,后续业务处理还可能涉及类型转换
java小经验的更多相关文章
- 你应该知道的那些Android小经验
原文出处:http://jayfeng.com/ 做Android久了,就会踩很多坑,被坑的多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录. 查看SQLite日志 ad ...
- Java有用经验总结--Swing篇
Java有用经验总结--Swing篇 前言 本文前言部分为我的一些感想,假设你仅仅对本文介绍的Java有用技巧感兴趣,能够跳过前言直接看正文的内容. 本文的写作动机来源于近期接给人家帮忙写的一个小程序 ...
- Android开发的16条小经验总结
Android开发的16条小经验总结,希望对各位搞Android开发的朋友有所帮助. 1. TextView中的getTextSize返回值是以像素(px)为单位的, 而setTextSize()是以 ...
- Android小经验
转载自:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dc ...
- Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)
前几天就g+里面看到有人引用这篇博文.看了一下.受益颇多. 所以翻译过来,希望和大家一起学习.本人英语水平有限,假设有错,请大家指正. 原文地址(须要翻墙):http://ja ...
- java正则表达式之java小爬虫
这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...
- Java项目经验
Java项目经验 转自CSDN. Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的 ...
- Java小项目--坦克大战(version1.0)
Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...
- 输出多行字符的一个简单JAVA小程序
public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...
随机推荐
- codeforces Gym 100500 J. Bye Bye Russia
Problem J. Bye Bye RussiaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1005 ...
- Codeforces Gym 100418B 暴力
Sum of sequencesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/v ...
- MRuby 编译笔记
专注于嵌入式脚本的MRuby在Windows下的编译笔记: 环境: OS: Windows 8.1, 使用 VS Express 2013 for Desktop. 材料: MRuby : 下载源码就 ...
- Delphi 多文件拖放获取路径示例
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...
- Android传感器编程带实例
看了程序人生 网站的 编程高手的编程感悟 深有感触,好像也是一个android 程序员写的,推荐大家也看看.话不多说,还是言归正传吧. 一.前言 我很喜欢电脑,可是笔记本还是太大,笔记本电脑再小还是要 ...
- 压力单位MPa、Psi和bar之间换算公式
压力单位MPa.Psi和bar之间换算公式 1bar=10^5PaPsi为英制压力单位.“磅力每平方英寸(1bf/in2)为1psi=6894.76 pa: 1bar等于10的5次方=10^5 pa ...
- System.Data.SQLite.EF6
2015.1.21 到目前为止这个破玩意不支持code first 建数据库 建表 代替方案 SQL Server Compact -------------------------------- ...
- java_线程-锁
package com.demo.test3; import java.util.concurrent.CountDownLatch; /** * @author QQ: 1236897 * */ / ...
- java_闭包和回调实现一边按键盘一边演讲
package ming; interface Teachable { void work(); } class Programer { private String name; public Str ...
- You Need This One Skill to Succeed in IT--reference
The ability to program in five languages, including one machine-level? Not it. Project management sk ...