利用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 ...
随机推荐
- Poj3321 Apple tree
翻译: 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根的编号永远是1.每个节点上最多结一个苹果.卡卡想要了解某一个子树上一共结了多少苹果. ...
- Graham凸包算法简介
凸包真是一个神奇的算法.. 概念 凸包,我理解为凸多边形 叉积 对于向量AB和向量BC,记向量AB*向量BC = AB * BC * sin ∠ABC,而叉积的绝对值其实就是S△ABC/2 对于平面上 ...
- linux jdk 和tomcat环境变量配置
系统版本:centos6.5版本 java版本:1.8 一.准备工作 1. java -version 检查是否有java环境,没有则需要去安装并配置到环境变量中. 2.下载tomcat包,下载地址: ...
- Redis之PHP操作
一.Redis连接与认证 //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connect('127.0.0.1', 6379, 3 ...
- 小程序 for循环 报错 Cannot read property 'total' of undefined
for循环一直报错 Cannot read property 'total' of undefined,但total在起初是有定义的,后来找到了问题,是i<=的问题,改为<不报错了. i ...
- es6学习笔记--字符串&数值&数组&函数&对象的扩展
这几天抽空学习了es6语法,关于字符串,数值,数组,函数以及对象的扩展,看到es6标准入门这本书,里面讲的扩展特别多,我认为有几部分在项目上用不到,就挑有用的当笔记学习了. 字符串的扩展 str.in ...
- NancyFX 第十二章 通道截拦
所有的好的Web框架都有一套好的通道截拦的机制,Nancy在我看来是处理最好的.那什么是请求通道那?下面的图可能说的比较清楚些: 正如名称中描述的,一个典型的Web请求在到达最终响应前会穿过一定数量的 ...
- 使用Python从Workflowy同步大纲到印象笔记
title: 从Workflowy到印象笔记 toc: true comment: true date: 2018-03-17 10:05:54 tags: ["Python", ...
- Ubuntu14.04安装pycharm用于Python开发环境部署,并且支持pycharm使用中文输入
一.目标 实现在Linux下用pycharm调试工具/Python开发 Linux使用vi/vim工具写Python,缺点:调试不方便,无代码提示.跳转等诸多功能. Windows使用idle/pyc ...
- TCP 详解
计算机网络中比较中要的无非就是 TCP/IP 协议栈,以及应用层的 HTTP 和 HTTPS . 前几天一直炒的的比较火的就是 HTTP/2.0 了,但是其实 HTTP/2.0 早在2015年的时候就 ...