利用java反射读写csv中的数据
前一段有个需求需要将从数据库读取到的信息保存到csv文件中,在实现该需求的时候发现资料比较少,经过收集反射和csv相关资料,最终得到了如下程序。
1.在使用java反射读取csv文件数据时,先通过csvreader jar包得到相关数据信息,然后格局反射去读指定对象的成员变量的信息,并转换数据格式最终将csv数据转化为对应的java实体类,该类是一个工具方法,只需要传入符合要求的数据就可以得到结果。
2.向csv文件写入指定的对象,文件的首行是该对象的成员变量名称。先根据指定的路径,编码格式创建csvwriter,然后根据反射读取对象的成员变量信息,将成员变量的名称写入csv文件的第一行,然后遍历数据集合,根据反射获取到信息并一一写入文件中。
大体思路是这样的,亲测可用,详细的方法代码如下:
使用java反射读取csv
/**
* 读取指定目录下的xxx.csv文件,并转化为java对象
*
* @param t 读取csv文件之后将要转换成的对象
* @param readFilePath csv文件所在路径
* @param charSet 编码格式
* @return 实体对象列表
*/
public static <T> List<T> readCsvDataToObject(T t, String readFilePath, String charSet) {
List<T> resultList = new ArrayList<T>();
// 创建CSV读对象
CsvReader csvReader = null;
try {
csvReader = new CsvReader(readFilePath, ',', Charset.forName(charSet));
// 所有成员变量
Field[] fields = t.getClass().getDeclaredFields();
// 成员变量的值
Object entityMemberValue = "";
//读取csv文件列标题
csvReader.readHeaders();
while (csvReader.readRecord()) {
Object newInstance = t.getClass().newInstance();
// 读一整行
csvReader.getRawRecord();
for (int f = 0; f < fields.length; f++) {
fields[f].setAccessible(true);
String fieldName = fields[f].getName();
entityMemberValue = getEntityMemberValue(entityMemberValue, fields, f, csvReader.get(fieldName));
// 赋值
PropertyUtils.setProperty(newInstance, fieldName, entityMemberValue);
}
resultList.add((T) newInstance);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != csvReader) {
csvReader.close();
}
}
return resultList;
}
/**
* 根据实体成员变量的类型得到成员变量的值
*
* @param realValue 要赋值的对象
* @param fields 赋值对象所有的成员变量
* @param f 具体赋值的第几个成员变量
* @param value 将要写入的值
* @return 转换之后的属性
*/
private static Object getEntityMemberValue(Object realValue, Field[] fields, int f, String value) throws ParseException, ClassNotFoundException {
String type = fields[f].getType().getName();
switch (type) {
case "char":
case "java.lang.Character":
case "java.lang.String":
realValue = value;
break;
case "java.util.Date":
realValue = "".equals(value) ? null : TimeTools.getStringToDate(value);
break;
case "java.lang.Integer":
realValue = "".equals(value) ? null : Integer.valueOf(value);
break;
case "int":
case "float":
case "double":
case "java.lang.Double":
case "java.lang.Float":
case "java.lang.Long":
case "java.lang.Short":
case "java.math.BigDecimal":
realValue = "".equals(value) ? null : new BigDecimal(value);
break;
default:
realValue = null;
break;
}
return realValue;
}
将指定数据写入csv文件中
/**
* 使用csvjava通过反射导出csv文件(通用方法)
*
* @param objectData 需要导出的java对象数据
* @param saveFilePath 导出文件所在路径
* @param charSet 文件编码格式
* @return 成功返回true 失败返回false
*/
public static <T> boolean generateCsv(List<T> objectData, String saveFilePath, String charSet) {
// 创建CSV写对象
CsvWriter csvWriter = null;
boolean flag = true;
try {
csvWriter = new CsvWriter(saveFilePath, ',', Charset.forName(charSet));
//获取数据属性信息并写入第一行
T firstData = objectData.get(0);
Field[] dataFields = firstData.getClass().getDeclaredFields();
for (Field field : dataFields) {
String fieldName = field.getName();
csvWriter.write(fieldName);
}
//第一行结束,换行
csvWriter.endRecord();
// 遍历集合数据,产生数据行
for (T data : objectData) {
// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
for (Field field : dataFields) {
if (field.toString().contains("static")) {
continue;
}
String fieldName = field.getName();
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Class dataClass = data.getClass();
Method getMethod = dataClass.getMethod(getMethodName, new Class[]{});
Object value = getMethod.invoke(data, new Object[]{});
// 判断值的类型后进行强制类型转换
String textValue;
if (value instanceof Date) {
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss");
textValue = sdf.format(date);
} else {
// 其它数据类型都当作字符串简单处理
if (value == null) {
value = "";
}
textValue = value.toString();
}
csvWriter.write(textValue);
}
//换行
csvWriter.endRecord();
}
} catch (Exception e) {
flag = false;
e.printStackTrace();
} finally {
//关闭
if (null != csvWriter) {
csvWriter.close();
}
}
return flag;
}
利用java反射读写csv中的数据的更多相关文章
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 packag ...
- 利用JAVA反射机制设计通用的DAO
利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...
- 利用Java反射机制对实体类的常用操作工具类ObjectUtil
代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...
- 利用Java反射机制将Bean转成Map
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- 利用Java反射根据类的名称获取属性信息和父类的属性信息
代码: import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java ...
- 利用java反射机制实现读取excel表格中的数据
如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来. 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>.Lis ...
随机推荐
- nginx学习之rewrite
rewrite 语法学习 什么是rewrite nginx的rewrite主要功是实现URL地址重写.nginx的rewrite规则需要PCRE的支持,既可以通过Perl兼容正则表达式进行规则匹配.n ...
- Java集合框架(二)
原文 http://www.jianshu.com/p/2070cb32accb List接口 查阅API,看 List 的介绍.有序的 collection (也称为序列).此接口的用户可以对列表 ...
- iOS 神秘而又强大的传感器系统 (附demo)
iOS中的各种传感器: 随着科技的发展,机器感知人的行为!Goole的无人驾驶汽车到李彦宏的无人驾汽车,都带入了各种计算及传感. 为了研究自然现象和制造劳动工具,人类必须了解外界的各类信息.了解外界信 ...
- Opencv读取并获取视频属性
opencv中通过VideoCaptrue类对视频进行读取操作以及调用摄像头.常用的操作如下: 1.常用构造函数 1.VideoCapture类的构造函数:C++: VideoCapture::Vid ...
- python笔记之异常
异常 內建异常在exceptions模块内,使用dir函数列出模块的内容. 自定义异常类:继承基类Exception. 异常可以使用raise语句引发,可以使用try ... except ... e ...
- python全栈开发-Day7 文件处理
python全栈开发-Day7 文件处理 一 .文件操作 一 .介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必 ...
- iOS 组件化的几篇文章
随着工程的成长,开发人员的增多,合理的模块划分及低耦合的重要性显得愈发重要.最近在思考这方面的问题,也读了不少通过组件化解耦的文章,这里记录一下. 前 5 篇文章有些关联,建议阅读顺序,1.3.2.4 ...
- pycharm创建Flask项目,jinja自动补全,flask智能提示
pycharm创建Flask项目,jinja自动补全,flask智能提示 之前一直都是用在idea里创建空项目然后导入,之后就没有各种的智能提示,在选择文类,选择模板之类的地方就会很麻烦. 步骤1:用 ...
- Go实现海量日志收集系统(一)
项目背景 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 当系统机器比较少时,登陆到服务器上查看即可满足 当系统机器规模巨大,登陆到机器上查看几乎不现实 当然即使是机器规模不大,一个系统通常 ...
- 【Ansible】 基于SSH的远程管理工具
[Ansible] 参考文档:[http://www.ansible.com.cn/docs/intro.html] 和ansible类似的工具还有saltstack,puppet,sshpass等, ...