利用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 ...
随机推荐
- HiHocoder1415 : 后缀数组三·重复旋律3 & Poj2774:Long Long Message
题面 HiHocoder1415 Poj2774 Sol 都是求最长公共子串,\(hihocoder\)上讲的很清楚 把两个串拼在一起,中间用一个特殊字符隔开 那么答案就是排序后相邻两个不同串的后缀的 ...
- BZOJ2820:YY的GCD
Sol 推导:\(n<m,p为质数\) \(ans=\sum_p\sum_{i=1}^{\frac{n}{p}}\mu(i)\frac{n}{pi}\frac{m}{pi}\) \(=\sum_ ...
- JavaScript 变量屏蔽
不同作用域中相同名称的变量就会触发变量屏蔽: { let x = {color:"blue"}; let y = x; let z = 3; { //重复定义x,所以对全局变量x进 ...
- 34.Ajax
优先级 如果发送的是[普通数据] jQuery XMLHttpRequest iframe 如果发送的是[文件] iframe jQuery(FormData) XMLHttpRequest(Form ...
- lambda表达式封装对数据库的查询
前言: 1.为什么要封装lambda表达式数据库查询,原因有一下几点: 1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询, ...
- CentOS6和CentOS7安装jumpserver
1.1 jumpserver安装 同步时间:ntpdate ntp1.aliyun.com 关闭selinux 关闭防火墙 系统字体修改成英文 1.1.1 安装依赖(前提需要epel源) yum in ...
- JavaScript编码规范(1)
参考的是百度公司的JS规范,分为两部分.这是第一部分 [建议] JavaScript 文件使用无 BOM 的 UTF-8 编码. 空格 [强制] 二元运算符两侧必须有一个空格,一元运算符与操作对象之间 ...
- 【Unity3D与23种设计模式】中介者模式(Mediator)
GoF中定义: 定义一个接口来封装一群对象的互动行为 中介者通过移除对象之间的引用 以减少他们之间的耦合度 并且能改变它们之间的互动独立性 游戏做的越大,系统划分的也就越多 如事件系统,关卡系统,信息 ...
- java反射使用及性能比较
环境准备 package com.lilei.pack09; public class Logger { public void show(){ System.out.println("he ...
- C语言第十一次作业--函数嵌套调用
一.实验作业 1.1 PTA题目:递归法对任意10个数据按降序排序 设计思路 定义整型循环变量i,最小值下标min,中间变量t 若n==1,直接返回 否则 min=10-n 最小值下标赋初值 for ...