大家好,欢迎来到IT知识分享网。
提示:以下是本篇文章正文内容,下面案例可供参考
一、E文件样例
示例:E文件中间的间隔为Table占位符。
<DataInfo> @ dccId ip type value point # 00 10.55.50.35 2 0 83 # 00 10.55.50.35 2 0 84 </DataInfo>
二、使用步骤
1.E文件生成
代码如下(示例):
package com.ieslab.D5000.utils; import com.alibaba.fastjson.JSON; import com.cache.EfileCache; import com.ieslab.eventsvr.model.RtdataReceive; import com.ieslab.utils.JsonUtil; import com.ieslab.utils.TimeUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.util.StringUtils; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.*; / * @author lh * @.com */ public class WriteEfile {
private static final Logger logger = LogManager.getLogger(WriteEfile.class); / * table间隔 */ private static final String SPLIT = "\t"; / * @param map key为E文件表头 value为实体类字段名称 * @param data 传入的结果集 * @param urls 生成文件的地址 * @param filename 文件名 注意 会自动当前生成文件夹 例如 2020-08-27/filename 注意实体类字段必须为String 不能为数组 List */ / * 时间转换工具 * * @param file * @return * @throws Exception */ private static final String TIME_STR = "yyyy-MM-dd HH:mm:ss.SSS"; public static void objectForDtNew(Map<String, String> map, List datas, String filename, String... urls) throws IOException {
try {
//获取所有key Set<String> keys = map.keySet(); //获取所有值 Collection<String> values = map.values(); //传入的对象 Object object = datas.get(0); for (int i = 0; i < urls.length; i++) {
String url = urls[i]; if (url == null || url.length() == 0 || "null".equals(url)) {
continue; } StringBuilder strurl = new StringBuilder(url); // strurl.append(File.separator).append(LocalDate.now().toString()); 不需要日期文件夹 File file = new File(strurl.toString()); //生成文件夹按照日期分类 if (!file.exists()) {
file.mkdirs(); } //创建Dt文件 File filedt = new File(file.getPath() + File.separator + filename); //设置编码 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filedt), "UTF-8")); //获取实体类名称写入标签 String classname = object.getClass().toString(); String name = classname.substring(classname.lastIndexOf(".") + 1); writer.write("<" + name + ">"); //换行 writer.newLine(); //设置标题 遍历表头 StringBuilder EtableHeader = new StringBuilder("@"); keys.forEach(e -> {
EtableHeader.append(SPLIT + e); }); //写入表头 writer.write(EtableHeader.toString()); //写入数据 for (Object data : datas) {
writer.newLine(); //获取实体类熟悉值 List<String> tabledata = new ArrayList<>(); //存放java反射获取的所有值 for (String value : values) {
//获取熟悉值 String valuedata = getFieldValueByName(value, data); //如果字段没有值默认认定为null字段 if (valuedata == null || "".equals(valuedata)) {
valuedata = "null"; }else {
//对文件特殊字符转换 String datalin = valuedata.replaceAll("<", "<").replaceAll(">", ">"); valuedata = datalin; } //将tab分隔符替换成空格防止对e文件产生影响 valuedata = valuedata.replace("\t", " "); tabledata.add(valuedata.trim()); } StringBuilder Etabledata = new StringBuilder("#"); for (String valuelist : tabledata) {
Etabledata.append(SPLIT + valuelist); } writer.write(Etabledata.toString()); } writer.newLine(); writer.write("</" + name + ">"); writer.flush(); writer.close(); } } catch (Exception e) {
e.printStackTrace(); System.out.println("解析失败"); } } / * 生成e文件 * @param clazz 实体类类名 * @param map 字段 * @param datas 数据 * @param filename 文件名 * @param urls 文件夹列表 * @throws IOException */ public static void objectForDt(Class clazz,Map<String, String> map, List datas, String filename, String... urls) throws IOException {
try {
//获取所有key Set<String> keys = map.keySet(); //获取所有值 Collection<String> values = map.values(); //传入的对象 Object object = datas.get(0); for (int i = 0; i < urls.length; i++) {
String url = urls[i]; if (url == null || url.length() == 0 || "null".equals(url)) {
continue; } StringBuilder strurl = new StringBuilder(url); strurl.append(File.separator).append(LocalDate.now().toString()); File file = new File(strurl.toString()); //生成文件夹按照日期分类 if (!file.exists()) {
file.mkdirs(); } //创建Dt文件 File filedt = new File(file.getPath() + File.separator + filename); //设置编码 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filedt), "UTF-8")); //获取实体类名称写入标签 String classname = object.getClass().toString(); String name = classname.substring(classname.lastIndexOf(".") + 1); writer.write("<" + name + ">"); //换行 writer.newLine(); //设置标题 遍历表头 StringBuilder EtableHeader = new StringBuilder("@"); keys.forEach(e -> {
EtableHeader.append(SPLIT + e); }); //写入表头 writer.write(EtableHeader.toString()); //写入数据 for (Object data : datas) {
writer.newLine(); //获取实体类熟悉值 List<String> tabledata = new ArrayList<>(); //存放java反射获取的所有值 for (String value : values) {
//获取熟悉值 String valuedata = String.valueOf(getFieldValueByName(clazz,value, data)); //如果字段没有值默认认定为null字段 if (valuedata == null || "".equals(valuedata)) {
valuedata = "null"; }else {
//对文件特殊字符转换 String datalin = valuedata.replaceAll("<", "<").replaceAll(">", ">"); valuedata = datalin; } //将tab分隔符替换成空格防止对e文件产生影响 valuedata = valuedata.replace("\t", " "); tabledata.add(valuedata.trim()); } StringBuilder Etabledata = new StringBuilder("#"); for (String valuelist : tabledata) {
Etabledata.append(SPLIT + valuelist); } writer.write(Etabledata.toString()); } writer.newLine(); writer.write("</" + name + ">"); writer.flush(); writer.close(); } } catch (Exception e) {
e.printStackTrace(); System.out.println("解析失败"); } } / * 根据类名获取字段名map * @param className 类名 * @return * @throws ClassNotFoundException * @throws Exception */ public static Map<String,String> getDataTableMap(String className) throws ClassNotFoundException,Exception {
if(StringUtils.isEmpty(className)){
return null; } //先从缓存中取 Map<String,String> table = EfileCache.getInstance().getClassFildValue(className); if(table == null || table.isEmpty()){
//如果没有,则使用反射,根据类名进行操作 Class<?> aClass = Class.forName(className); //获取类名中的字段 Field[] fields = aClass.getDeclaredFields(); table = new HashMap<>(); for(Field field : fields){
if(!Modifier.isStatic(field.getModifiers())){
//静态属性不要 String name = field.getName(); table.put(name,name); } } //存入缓存 EfileCache.getInstance().putClassFiledValue(className,table); } return table; } / * 根据字段名称获取对象的属性 * 本方法有一定缺陷,仅通过"get"拼接获取属性的方法,如果有boolean,则会抛出异常 * * @param fieldName * @param target * @return * @throws Exception */ @Deprecated public static String getFieldValueByName(String fieldName, Object target) throws Exception {
String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + fieldName.substring(1); Method method = target.getClass().getMethod(getter, new Class[0]); Object e = method.invoke(target, new Object[0]); //判断时间格式转换 if (e instanceof Date) {
Date date = (Date) e; SimpleDateFormat SDF = new SimpleDateFormat(TIME_STR); return SDF.format(date); } else if (e instanceof List) {
return JsonUtil.toString(e); } else {
return String.valueOf(e); } } / * 根据字段名称获取对象的属性 * * @param clazz 类名 * @param fieldName 字段名 * @param target 目标值 * @return * @throws Exception */ public static Object getFieldValueByName(Class clazz,String fieldName, Object target) throws Exception {
String firstLetter = fieldName.substring(0, 1).toUpperCase(); //获取属性类型 Field declaredField = clazz.getDeclaredField(fieldName); Class<?> type = declaredField.getType(); String getter; if(type == Boolean.class || type == Boolean.TYPE){
//boolean是用is开头的,Boolean.TYPE表示基本数据类型boolean getter = "is" + firstLetter + fieldName.substring(1); }else {
getter = "get" + firstLetter + fieldName.substring(1); } if(null == target){
return ""; } Method method = target.getClass().getMethod(getter, new Class[0]); Object e = method.invoke(target, new Object[0]); //判断时间格式转换 if(e instanceof Date){
Date date=(Date)e; //Date 转换为LocalDateTime 转换为时间字符 使用线程安全的 DateTimeFormatter String resDate = TimeUtils.getNowDateToString6(date); return resDate; }else if (e instanceof Map){
String Map = JSON.toJSONString(e); return Map; }else if(e instanceof Collection){
String s = JSON.toJSONString(e); return s; }else if(type.isEnum() || type.isPrimitive() || type == String.class){
//泛型,基本数据类型,strign就用普通字符串 return e; }else{
//其他的比如entity转换成json String s = JsonUtil.toString(e); return s; } } public static void main(String[] args) throws Exception {
//例子 // List<RtdataReceive> rtEventList=new ArrayList<>(); // String fileName="beidiao_diskArray_rtEvent_"+System.currentTimeMillis()+".dt"; // Map<String, String> dataTableMap = WriteEfile.getDataTableMap("com.ieslab.eventsvr.model.RtEvent"); // WriteEfile.objectForDtNew(dataTableMap,rtEventList,fileName,EmsMain.d5000_alarm_url); } }
2.文件生成实例
代码如下(示例):
String fileName="beidiao_diskArray_rtEvent_"+System.currentTimeMillis()+".dt"; Map<String, String> dataTableMap = WriteEfile.getDataTableMap("com.ieslab.eventsvr.model.RtEvent"); WriteEfile.objectForDtNew(dataTableMap,rtEventList,fileName,EmsMain.d5000_alarm_url);
保持文件名不重复可以使用时间戳,多线程下建议使用时间戳在凭借上线程名字防止文件同名会覆盖数据。
总结
以上就是E文件的生成代码实例不懂的可以@我
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112890.html