本文源码:GitHub·点这里 || GitEE·点这里

一、文档类型简介

1、XML文档

XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如数据结构,格式等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。适合网络传输,提供统一的方法来描述和交换应用程序的结构化数据。

2、CSV文档

CSV文档,以逗号分隔文档内容值,其文件以纯文本形式存储结构数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号。CSV是一种通用的、相对简单的文件格式,通常被用在大数据领域,进行大规模的数据搬运操作。

二、XML文件管理

1、Dom4j依赖

Dom4j是基于Java编写的XML文件操作的API包,用来读写XML文件。具有性能优异、功能强大和简单易使用的特点。

<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>

2、基于API封装方法

涉及对XML文件读取、加载、遍历、创建、修改、删除等常用方法。

public class XmlUtil {
/**
* 创建文档
*/
public static Document getDocument (String filename) {
File xmlFile = new File(filename) ;
Document document = null;
if (xmlFile.exists()){
try{
SAXReader saxReader = new SAXReader();
document = saxReader.read(xmlFile);
} catch (Exception e){
e.printStackTrace();
}
}
return document ;
} /**
* 遍历根节点
*/
public static Document iteratorNode (String filename) {
Document document = getDocument(filename) ;
if (document != null) {
Element root = document.getRootElement();
Iterator iterator = root.elementIterator() ;
while (iterator.hasNext()) {
Element element = (Element) iterator.next();
System.out.println(element.getName());
}
}
return document ;
} /**
* 创建XML文档
*/
public static void createXML (String filePath) throws Exception {
// 创建 Document 对象
Document document = DocumentHelper.createDocument();
// 创建节点,首个节点默认为根节点
Element rootElement = document.addElement("project");
Element parentElement = rootElement.addElement("parent");
parentElement.addComment("版本描述") ;
Element groupIdElement = parentElement.addElement("groupId") ;
Element artifactIdElement = parentElement.addElement("artifactId") ;
Element versionElement = parentElement.addElement("version") ;
groupIdElement.setText("SpringBoot2");
artifactIdElement.setText("spring-boot-starters");
versionElement.setText("2.1.3.RELEASE");
//设置输出编码
OutputFormat format = OutputFormat.createPrettyPrint();
File xmlFile = new File(filePath);
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(xmlFile),format);
writer.write(document);
writer.close();
} /**
* 更新节点
*/
public static void updateXML (String filePath) throws Exception {
Document document = getDocument (filePath) ;
if (document != null){
// 修改指定节点
List elementList = document.selectNodes("/project/parent/groupId");
Iterator iterator = elementList.iterator() ;
while (iterator.hasNext()){
Element element = (Element) iterator.next() ;
element.setText("spring-boot-2");
}
//设置输出编码
OutputFormat format = OutputFormat.createPrettyPrint();
File xmlFile = new File(filePath);
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(xmlFile),format);
writer.write(document);
writer.close();
}
} /**
* 删除节点
*/
public static void removeElement (String filePath) throws Exception {
Document document = getDocument (filePath) ;
if (document != null){
// 修改指定节点
List elementList = document.selectNodes("/project/parent");
Iterator iterator = elementList.iterator() ;
while (iterator.hasNext()){
Element parentElement = (Element) iterator.next() ;
Iterator parentIterator = parentElement.elementIterator() ;
while (parentIterator.hasNext()){
Element childElement = (Element)parentIterator.next() ;
if (childElement.getName().equals("version")) {
parentElement.remove(childElement) ;
}
}
}
//设置输出编码
OutputFormat format = OutputFormat.createPrettyPrint();
File xmlFile = new File(filePath);
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(xmlFile),format);
writer.write(document);
writer.close();
}
}
public static void main(String[] args) throws Exception {
String filePath = "F:\\file-type\\project-cf.xml" ;
// 1、创建文档
Document document = getDocument(filePath) ;
System.out.println(document.getRootElement().getName());
// 2、根节点遍历
iteratorNode(filePath);
// 3、创建XML文件
String newFile = "F:\\file-type\\project-cf-new.xml" ;
createXML(newFile) ;
// 4、更新XML文件
updateXML(newFile) ;
// 5、删除节点
removeElement(newFile) ;
}
}

3、执行效果图

三、CSV文件管理

1、CSV文件样式

这里不需要依赖特定的Jar包,按照普通的文件读取即可。

2、文件读取

@Async
@Override
public void readNotify(String path, Integer columnSize) throws Exception {
File file = new File(path) ;
String fileName = file.getName() ;
int lineNum = 0 ;
if (fileName.startsWith("data-")) {
InputStreamReader isr = new InputStreamReader(new FileInputStream(file),"GBK") ;
BufferedReader reader = new BufferedReader(isr);
List<DataInfo> dataInfoList = new ArrayList<>(4);
String line ;
while ((line = reader.readLine()) != null) {
lineNum ++ ;
String[] dataArray = line.split(",");
if (dataArray.length == columnSize) {
String cityName = new String(dataArray[1].getBytes(),"UTF-8") ;
dataInfoList.add(new DataInfo(Integer.parseInt(dataArray[0]),cityName,dataArray[2])) ;
}
if (dataInfoList.size() >= 4){
LOGGER.info("容器数据:"+dataInfoList);
dataInfoList.clear();
}
}
if (dataInfoList.size()>0){
LOGGER.info("最后数据:"+dataInfoList);
}
reader.close();
}
LOGGER.info("读取数据条数:"+lineNum);
}

3、文件创建

@Async
@Override
public void createCsv(List<String> dataList,String path) throws Exception {
File file = new File(path) ;
boolean createFile = false ;
if (file.exists()){
boolean deleteFile = file.delete() ;
LOGGER.info("deleteFile:"+deleteFile);
}
createFile = file.createNewFile() ;
OutputStreamWriter ost = new OutputStreamWriter(new FileOutputStream(path),"UTF-8") ;
BufferedWriter out = new BufferedWriter(ost);
if (createFile){
for (String line:dataList){
if (!StringUtils.isEmpty(line)){
out.write(line);
out.newLine();
}
}
}
out.close();
}

4、编写测试接口

这里基于Swagger2管理接口测试 。

@Api("Csv接口管理")
@RestController
public class CsvWeb {
@Resource
private CsvService csvService ;
@ApiOperation(value="文件读取")
@GetMapping("/csv/readNotify")
public String readNotify (@RequestParam("path") String path,
@RequestParam("column") Integer columnSize) throws Exception {
csvService.readNotify(path,columnSize);
return "success" ;
}
@ApiOperation(value="创建文件")
@GetMapping("/csv/createCsv")
public String createCsv (@RequestParam("path") String path) throws Exception {
List<String> dataList = new ArrayList<>() ;
dataList.add("1,北京,beijing") ;
dataList.add("2,上海,shanghai") ;
dataList.add("3,苏州,suzhou") ;
csvService.createCsv(dataList,path);
return "success" ;
}
}

四、源代码地址

文中涉及文件类型,在该章节源码ware18-file-parent/case-file-type目录下。

GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent

推荐阅读:Spring框架基础

核心组件总结,基础环境搭建

Bean的装配,作用域,生命周期

核心思想IOC容器总结,案例演示

AOP编程概念,几种实现方式演示

事务管理机制,和实现方式

Mvc架构模式简介,执行流程详解

文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型的更多相关文章

  1. 文件系统(01):基于SpringBoot框架,管理Excel和PDF文件类型

    本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.Excel文档 Excel一款电子表格软件.直观的界面.出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Ex ...

  2. 如何用SpringBoot框架来接收multipart/form-data文件

    https://blog.csdn.net/linzhiqiang0316/article/details/77016997 ************************************* ...

  3. Vue Element-ui 框架:路由设置 限制文件类型 表单验证 回车提交 注意事项 监听事件

    1.验证上传文件的类型: (1)验证图片类型 <template> <el-upload class="avatar-uploader" action=" ...

  4. 记录SSM框架项目迁移SpringBoot框架-----pom.xml的迁移

    第一步:迁移pom.xml文件(去除spring相关的依赖) SSM中的pom: <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  5. 基于Spring-Boot框架的Elasticsearch搜索服务器配置

    一.相关包maven配置 <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-elastic ...

  6. 基于SpringBoot框架企业级应用系统开发全面实战

    Eclipse 安装spring-tool-suite教程,并创建一个新的springboot项目 使用SpringBoot构建项目,加载SSM整合的applicationContext.xml的注解 ...

  7. 用AOP拦截自定义注解并获取注解属性与上下文参数(基于Springboot框架)

    目录 自定义注解 定义切面 获取上下文信息JoinPoint ProceedingJoinPoint 定义测试方法 测试结果 小结 AOP可以用于日志的设计,这样话就少不了要获取上下文的信息,博主在设 ...

  8. java代码和spring框架读取xml和properties文件

    1.java文件读取properties文件 Properties props = new Properties(); try { //资源文件存放在类文件的根目录下.即是放在src下面.则不需要写路 ...

  9. SpringBoot-文件系统-Excel,PDF,XML,CSV

    SpringBoot-文件系统-Excel,PDF,XML,CSV 1.Excel文件管理 1.1 POI依赖 1.2 文件读取 1.3 文件创建 1.4 文件导出 1.5 文件导出接口 2.PDF文 ...

随机推荐

  1. $Loj10157$ 皇宫看守 树形$DP$

    loj Description 有一些宫殿,它们呈树形结构,相邻的宫殿之间可以互相望见.在一些宫殿设立士兵,使得所有的宫殿都有士兵或是被士兵望见.求最小士兵数. Sol 状态: f[x][0] 表示结 ...

  2. 【uuid】- 唯一标识

    2020-01-02 UUID ,Universally Unique Identifier ,通用唯一标识符. //定义一个生成 uuid 的方法const getUuid = () => { ...

  3. j接近50道经典SQL练习题,附建表SQL解题SQL

    说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...

  4. JAVA的引用类型

    一.强引用 JAVA默认的引用类型,强引用,是在我们的开发工作当中普遍存在的.如果一个对象具有强引用,当内存空间不足的时候,java虚拟机宁可抛出OOM异常,也不会回收它来释放内存.但是我们可以将对象 ...

  5. linux入门系列2--CentOs图形界面操作及目录结构

    上一篇文章"linux入门系列1--环境准备及linux安装"直观演示了虚拟机软件VMware和Centos操作系统的安装,按照文章一步一步操作,一定都可以安装成功.装好系统之后, ...

  6. docker练习-堆栈

    介绍 分布式应用程序层次结构的顶部:堆栈. 堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起. 单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个堆栈 ...

  7. CS系列(一):Cobalt Strike初体验

    0X01 环境准备 Cobalt Strike安装包(链接:https://pan.baidu.com/s/1wCHJcJrF6H0wUCdetz3Xjg 提取码:rjuj) Cobalt Strik ...

  8. TVP思享 | 四个全新维度,极限优化HTTP性能

    导语 | 当产品的用户量不断翻番时,需求会倒逼着你优化HTTP协议.那么,要想极限优化HTTP性能,应该从哪些维度出发呢?本文将由TVP陶辉老师,为大家分享四个全新维度.「TVP思享」专栏,凝结大咖思 ...

  9. OSS上传图片无法在线预览的解决方案

    OSS上传图片无法在线预览的解决方案 最近在做的项目涉及到商品详情,由于前端用的flutter框架并且该详情为富文本,dart语言关于富文本的组件不是非常友好,当富文本中的图片无法在浏览器中直接预览的 ...

  10. 扫描器是如何判定有xss漏洞的

    这个问题,看似简单,实则触及到很多人的知识盲区 我们都知道,弹窗就能判定这个页面存在xss, 那么扫描器是怎么判断的呢,或者说扫描器是怎么判断是否弹窗的呢 测试发现 当响应的头中content-typ ...