实战:第十二章:txt文件转xml文件

@Transactional

@Override

public JSONObject dataDistribution(DataDistributionVo dataDistributionVo) {

//错误信息收集

String errorLog = “”;

StringBuffer stringBuffer = new StringBuffer(errorLog);

//发布范围不能超过订阅范围 获取订阅信息

JSONObject subscriptionInfo = subscriptionInfoService.getSubscriptionInfo(dataDistributionVo.getAppId(), dataDistributionVo.getAppCode(),

dataDistributionVo.getServiceName(), dataDistributionVo.getServiceCode(), null, null, null);

List subscriptionList = (List) subscriptionInfo.get(“subscriptionList”);

if(CollectionUtils.isEmpty(subscriptionList)){

errorLog = DatabusConstant.ERROR_LOG_SUBSCRIPTION;

stringBuffer.append(errorLog).append(“;”);

}else {

//获取订阅范围: 将所有服务标识获取出来存入字符数组,这个数组就是订阅范围

String[] strings = new String[subscriptionList.size()];

for (int i = 0; i < subscriptionList.size(); i++) {

strings[i] = subscriptionList.get(i).getSERVICE_CODE();

}

if(!StringUtil.isEmpty(dataDistributionVo.getReleaseScope())){

//遍历发布范围 OA,ERP,RS

String[] split = dataDistributionVo.getReleaseScope().split(“,”);

for (String dataDistributionServiceCode : split) {

//判断该发布范围是否包含在订阅范围内

boolean contains = Arrays.asList(strings).contains(dataDistributionServiceCode);

if(!contains){

//发布不包含在订阅范围内

errorLog = DatabusConstant.ERROR_LOG_RELEASESCOPE;

stringBuffer.append(errorLog).append(“;”);

}

}

}

}

String fileUrl = “”;

//文件和文件名不能为空

if(dataDistributionVo.getFile().isEmpty() || “”.equals(dataDistributionVo.getFile().getOriginalFilename())){

errorLog = DatabusConstant.ERROR_LOG_FILE_NOT_EMPTY;

stringBuffer.append(errorLog).append(“;”);

}else {

//文件大小不能超过300M,314572800是对应300M的字节

if(dataDistributionVo.getFile().getSize() > 314572800){

errorLog = DatabusConstant.ERROR_LOG_FILE_SIZE;

stringBuffer.append(errorLog).append(“;”);

}else {

String format = new SimpleDateFormat(“yyyy-MM-dd”).format(new Date());

//拼接路径 盘符:D:/ + App/Service/Date/

fileUrl = DatabusConstant.DISK_CHARACTER + dataDistributionVo.getAppCode() + “/” + dataDistributionVo.getServiceCode() + “/” + format + “/”;

try {

File saveFile = new File(fileUrl);

if(!saveFile.exists()){

//不存在时,创建文件夹

saveFile.mkdirs();

}

//将txt文本文件转成xml文件写入磁盘

txtToXml(dataDistributionVo,fileUrl,errorLog,stringBuffer);

// //直接保存的txt文件

// File data = new File(saveFile, dataDistributionVo.getFile().getName());

// //保存文件,使用transferTo()保存必须要绝对路径且文件夹必须已存在,否则报错

// dataDistributionVo.getFile().transferTo(data);

} catch (Exception e) {

errorLog = DatabusConstant.ERROT_LOG_FILE_UPLOAD + e.getMessage();

stringBuffer.append(errorLog).append(“;”);

System.out.println(e.getMessage());

e.printStackTrace();

}

}

}

//发送MQ

String sendKey = “serviceCode:” + dataDistributionVo.getServiceCode();

SendMqDataVo sendMqDataVo = new SendMqDataVo();

sendMqDataVo.setFileUrl(fileUrl + dataDistributionVo.getFile().getName());

sendMqDataVo.setReleaseRange(dataDistributionVo.getReleaseScope());

sendMqDataVo.setSubscriptionEntityList(subscriptionList);

sendMqDataVo.setToken(dataDistributionVo.getPubToken());

rabbitTemplate.convertAndSend(sendKey,sendMqDataVo);

//添加数据发布记录

String uuid = UUIDGenerator.getUUID();

Sql dataServiceSql = new Sql(“INSERT INTO g_app_data_service(ID,APP_ID,APP_CODE,SERVICE_NAME,SERVICE_CODE,MEMO) VALUES(?,?,?,?,?,?)”);

dataServiceSql.addParameter(new Parameter(“ID”, uuid , DbType.STRING));

dataServiceSql.addParameter(new Parameter(“APP_ID”, dataDistributionVo.getAppId(), DbType.STRING));

dataServiceSql.addParameter(new Parameter(“APP_CODE”, dataDistributionVo.getAppCode(), DbType.STRING));

dataServiceSql.addParameter(new Parameter(“SERVICE_NAME”, dataDistributionVo.getServiceName(), DbType.STRING));

dataServiceSql.addParameter(new Parameter(“SERVICE_CODE”, dataDistributionVo.getServiceCode(), DbType.STRING));

dataServiceSql.addParameter(new Parameter(“MEMO”, dataDistributionVo.getMemo(), DbType.STRING));

String flag = DBManager.execute(dataServiceSql) ? uuid : null;

if(StringUtil.isEmpty(flag)){

errorLog = DatabusConstant.ERROR_LOG_INSERT_DATADISTRIBUTION;

stringBuffer.append(errorLog).append(“;”);

}

//添加数据发布日志记录

Sql sqlDataServiceLog = new Sql(“INSERT INTO g_app_data_service_log(ID,PUBAPP_CODE,PUBAPP_NAME,SERVICE_ID,SERVICE_NAME,PUB_RANGE,PUB_TOKEN,MQ_CHANNEL,PUB_TIME,ERROE_LOG) VALUES(?,?,?,?,?,?,?,?,?,?)”);

sqlDataServiceLog.addParameter(new Parameter(“ID”, uuid , DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“PUBAPP_CODE”, dataDistributionVo.getAppId() , DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“PUBAPP_NAME”, null, DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“SERVICE_ID”, null , DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“SERVICE_NAME”, dataDistributionVo.getServiceName() , DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“PUB_RANGE”, dataDistributionVo.getServiceCode() , DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“PUB_TOKEN”, dataDistributionVo.getPubToken() , DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“MQ_CHANNEL”, sendKey , DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“PUB_TIME”, new Date(), DbType.STRING));

sqlDataServiceLog.addParameter(new Parameter(“ERROE_LOG”, stringBuffer.toString(), DbType.STRING));

String bool = DBManager.execute(dataServiceSql) ? uuid : null;

if(StringUtil.isEmpty(bool)){

errorLog = DatabusConstant.ERROR_LOG_INSERT_DATADISTRIBUTION_Log;

stringBuffer.append(errorLog).append(“;”);

}

//返回结果

JSONObject jsonObject = new JSONObject();

if(StringUtil.isEmpty(errorLog)){

jsonObject.put(“success”,“执行成功”);

}else {

jsonObject.put(“faile”,stringBuffer.toString());

}

return jsonObject;

}

/**

  • txt类型转xml

  • @param dataDistributionVo

  • @param fileUrl

  • @param errorLog

  • @param stringBuffer

*/

private void txtToXml(DataDistributionVo dataDistributionVo,String fileUrl,String errorLog,StringBuffer stringBuffer){

//multipartFile类型转File类型

File multipartFileToFile = multipartFileToFile(dataDistributionVo.getFile(),fileUrl,errorLog,stringBuffer);

if(multipartFileToFile != null){

StringBuffer buffer = new StringBuffer();

try {

//解决中文乱码

String code = getFileEncode(multipartFileToFile.getAbsolutePath(),errorLog,stringBuffer);

if(“asci”.equals(code)){

// 这里采用GBK编码,而不用环境编码格式,因为环境默认编码不等于操作系统编码

code = “GBK”;

}

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(multipartFileToFile), code));

String line = null;

while((line = br.readLine()) != null){

buffer.append(line.trim());

}

String dataText = buffer.toString();

String txtToXml = “<![CDATA[" + dataText + "]]>”;

//文本转xml

Document document = DocumentHelper.createDocument();

//需要一个根节点list,否则重新写入是会出现无法向此文档添加已存在的元素

Element list = document.addElement(“list”);

Element service = list.addElement(“service”);

Element range = list.addElement(“range”);

Element data = list.addElement(“data”);//<![CDATA[文本内容]]>

//设置节点数据

data.setText(txtToXml);

service.setText(dataDistributionVo.getServiceCode());

range.setText(dataDistributionVo.getReleaseScope());

//写入xml文件

String xmlUrl = fileUrl + dataDistributionVo.getFile().getOriginalFilename() + “.xml”;

//如果存在则重新写入

Writer filewriter = new FileWriter(xmlUrl);

XMLWriter xmlWriter = new XMLWriter(filewriter);

xmlWriter.write(document);

xmlWriter.close();

} catch (IOException e) {

errorLog = DatabusConstant.ERROR_LOG_TXT_TO_XML;

stringBuffer.append(errorLog).append(“;”);

System.out.println(e.getMessage());

e.printStackTrace();

}

}else {

//如果file为空,则在multipartFile转File过程中发生异常,导致传出来是一个空的file

errorLog = DatabusConstant.ERROR_LOG_MULTIPARTFILE_TO_FILE;

stringBuffer.append(errorLog).append(“;”);

}

}

/**

  • multipartFile转File

  • @param file

  • @param errorLog

  • @param stringBuffer

  • @return

*/

private File multipartFileToFile(MultipartFile file,String fileUrl,String errorLog,StringBuffer stringBuffer){

File toFile = null;

try {

InputStream ins = file.getInputStream();

toFile = new File(fileUrl,file.getOriginalFilename());

OutputStream os = new FileOutputStream(toFile);

//读取的内容的长度,用来装数据

int bytesRead = 0;

//缓冲区数组

byte[] buffer = new byte[8192];

while ((bytesRead = ins.read(buffer,0,8192)) != -1) {

os.write(buffer, 0, bytesRead);

}

os.close();

ins.close();

} catch (IOException e) {

errorLog = DatabusConstant.ERROR_LOG_MULTIPARTFILE_TO_FILE;

stringBuffer.append(errorLog).append(“;”);

System.out.println(e.getMessage());

e.printStackTrace();

}

return toFile;

}

/**

  • 获取文件编码

  • @param path 文件的路径

  • @return

*/

private String getFileEncode(String path,String errorLog,StringBuffer stringBuffer) {

String charset =“asci”;

byte[] first3Bytes = new byte[3];

BufferedInputStream bis = null;

try {

boolean checked = false;

bis = new BufferedInputStream(new FileInputStream(path));

bis.mark(0);

int read = bis.read(first3Bytes, 0, 3);

if (read == -1)

return charset;

if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {

charset = “Unicode”;//UTF-16LE

checked = true;

} else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) {

charset = “Unicode”;//UTF-16BE

checked = true;

} else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB && first3Bytes[2] == (byte) 0xBF) {

charset = “UTF8”;

checked = true;

}

bis.reset();

if (!checked) {

int loc = 0;

while ((read = bis.read()) != -1) {

loc++;

if (read >= 0xF0) {

break;

}

//单独出现BF以下的,也算是GBK

if (0x80 <= read && read <= 0xBF) {

break;

}

if (0xC0 <= read && read <= 0xDF) {

read = bis.read();

if (0x80 <= read && read <= 0xBF) {

//双字节 (0xC0 - 0xDF) (0x80 - 0xBF),也可能在GB编码内

continue;

}else{

break;

}

} else if (0xE0 <= read && read <= 0xEF) { //也有可能出错,但是几率较小

read = bis.read();

if (0x80 <= read && read <= 0xBF) {

read = bis.read();

if (0x80 <= read && read <= 0xBF) {

charset = “UTF-8”;

break;

} else{

break;

}

} else{

break;

}

}

}

}

} catch (Exception e) {

errorLog = DatabusConstant.ERROR_LOG_FILE_ENCODE;

stringBuffer.append(errorLog).append(“;”);

System.out.println(e.getMessage());

e.printStackTrace();

} finally {

if (bis != null) {

try {

bis.close();

} catch (IOException ex) {

errorLog = DatabusConstant.ERROR_LOG_FILE_ENCODE;

stringBuffer.append(errorLog).append(“;”);

System.out.println(ex.getMessage());

}

}

}

return charset;

}

}

import org.springframework.web.multipart.MultipartFile;

public class DataDistributionVo {

MultipartFile file;//数据包

String releaseScope;//发布范围 例如:OA,ERP,RS

String appId;//应用id

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

在这里插入图片描述

在这里插入图片描述

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

[外链图片转存中…(img-6uECytdH-1713643976899)]

[外链图片转存中…(img-CDLznPCL-1713643976899)]

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值