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("-------------- ...
随机推荐
- andriod开发,简单的封装网络请求并监听返回.
一.为什么封装 因为android 4.0 以后的发送网络请求必须要放到异步线程中,而异步线程必须跟handle合作才能更新主线程中的UI,所以建议用一个类继承handler来异步处理网络请求. 二. ...
- 关于Struts2的客户端校验的FreeMarker template error!
把<s:form action="login" namespace="/" validate="true" >改为 <s: ...
- MyBatis之六:缓存
MyBatis 3中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置.默认情况下是没有开启缓存的,除了局部的session缓存,可以增强变现而且处理循环依赖也是必须的.要开启二级缓存,你需 ...
- android 用ListView实现表格样式
原文:http://blog.csdn.net/centralperk/article/details/8016350 效果图: 源码下载地址:http://download.csdn.net/det ...
- Windows 7旗舰版搭建andriod 4.0开发环境记录
搭建Android环境步骤(仅供参考): 官方搭建步骤: http://developer.android.com/index.html 搭建环境之前需要下载下面几个文件包: 一.安装Java运行环境 ...
- iOS viewDidUnload方法
转自:http://blog.csdn.net/chun799/article/details/8951694 在iOS6中,viewDidUnload回调方法被Deprecated掉了.查看苹果的文 ...
- MAC SVN Phonegap
1. Windows上用VisualSVN Server Manager创建好Repository. 2. 在MAC上,用Phonegap创建好项目,比如在Project1目录里的App目录. 3. ...
- uboot_starts_analysis.pdf
Uboot中start.S源码的指令级的详尽解析 HTML版本的在线地址为:http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/ ...
- C. Fox And Names
C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Boxes in a Line
Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...