前一段有个需求需要将从数据库读取到的信息保存到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中的数据的更多相关文章

  1. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  2. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  3. 利用java反射调用类的的私有方法--转

    原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...

  4. 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

    有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 packag ...

  5. 利用JAVA反射机制设计通用的DAO

    利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,    那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...

  6. 利用Java反射机制对实体类的常用操作工具类ObjectUtil

    代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...

  7. 利用Java反射机制将Bean转成Map

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...

  8. 利用Java反射根据类的名称获取属性信息和父类的属性信息

    代码: import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java ...

  9. 利用java反射机制实现读取excel表格中的数据

    如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来. 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>.Lis ...

随机推荐

  1. [Luogu2973][USACO10HOL]赶小猪

    Luogu sol 首先解释一波这道题无重边无自环 设\(f_i\)表示\(i\)点上面的答案. 方程 \[f_u=\sum_{v,(u,v)\in E}(1-\frac PQ)\frac{f_v}{ ...

  2. BZOJ 1123:城市道路

    Sol 就是求割点,把贡献算一下就好...直接tarjan # include <bits/stdc++.h> # define RG register # define IL inlin ...

  3. luoguP2711 小行星

    题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最少次数. 输入输出格式 输入格式: 第1行为小行星个数 ...

  4. APIO2010特别行动队

    斜率优化 # include <stdio.h> # include <stdlib.h> # include <iostream> # include <s ...

  5. 服务器安装centos

    谈一下今天遇到的problem,虽然很基础,但是还是值得记录一下: 1.制作启动盘,并不需要使用UltralISO刻录,可以通过在linux下dd命令直接制作iso镜像启动盘下面是步骤: 1)打开终端 ...

  6. SQL Server 历史SQL执行记录

    编程执行Sql语句难免忘记保存执行的文本,或是意外设备故障多种情况的发生.对于写的简单的Sql语句丢了就丢了,但对于自己写的复杂的丢失就有些慌了, 有时候很难再次写出来,这时候就需要用一些方法找回Sq ...

  7. [转]svn diff 替代工具

    svn diff 替代工具 http://blog.csdn.net/fudesign2008/article/details/8168811 一. 使用vimdiff替换svn diff: 对于多数 ...

  8. shell脚本中文件测试

    shell脚本中文件测试 author:headsen chen  2017-10-17  14:35:19 个人原创,转载请注明作者,否则 依法追究法律责任 [ -f  filename  ]   ...

  9. Java 常用单词

    1.Object-Oriented ['əbdʒekt'ɔ:rɪəntɪd] 面向对象 adj 2.inheritance  [ɪnˈherɪtəns]  继承;遗传;遗产 n inherit  [ɪ ...

  10. Gauge----自动化测试工具

    * Gauge是一个自动化测试工具,主要是通过.spec 文件指定执行的步骤,然后由Java代码去测试 安装: * 安装插件 Gauge--install-all *在IDEA中安装Gauge插件 基 ...