如果你是初学者,看的话肯定是看不懂的 代码太乱了各种技术混合, 我下面源码包括用到的全部代码都贴上了 你只需要 按部就班的打完 然后在仔细看一遍就会了
<?xml version="1.0" encoding="utf-8" ?>
<student>
<name id="name">胡安民</name>
<age>123</age>
<sex>男</sex>
</student>
student 就是根节点 其他的节点就是student的子节点…
元素就是标签 属性 就是标签的的变量
在xml 中 < > 会被 解析的 所以 在内容中不能使用但是可以使 用 <``>
还可以使用 <name>哈希把<![CDATA[ 内容不会被转义 ]] </name> 在这里面写的内容是不会被转义的
xml约束就是规范文件内容的
一个xml 文件中只能有一个 DTD约束
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students [ <!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> ]>
<students>
<student number="s12">
<name>胡安民</name>
<age>21</age>
<sex>男</sex>
</student>
<student number="s13">
<name>胡安民</name>
<age>21</age>
<sex>男</sex>
</student>
</students>
students (student+) 代表 根元素必须是students 子元素可以有至少1个以上student
student (name,age,sex) 是student 元素内必须有 name,age,sex这三个子元素
name (/#PCDATA) age (/#PCDATA) sex (/#PCDATA) 代表是内容必须是文本
student number ID /#REQUIRED 代表 是唯一的值 而且首个字必须 为非数字
外部导入方式
本地:<!DOCTYPE 根标签名 SYSTEM “dtd文件的位置”>
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students SYSTEM "yueshu.dtd">
<students>
<student number="s12">
<name>胡安民</name>
<age>21</age>
<sex>男</sex>
</student>
<student number="s13">
<name>胡安民</name>
<age>21</age>
<sex>男</sex>
</student>
</students>
导入网络上的DTD约束:
<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
一般情况 自己使用 的不多 都是引用 别人写好的 框架 比如mvc
后缀是xsd
xsd约束文件内容
<?xml version="1.0"?>
<!-- xmlns="http://www.xh.cn/xml" 这个是 命名空间 用于别人 引用你写的文件约束 -->
<!--xmlns:xsd="http://www.w3.org/2001/XMLSchema" 是固定的 官方-->
<!--最后一行 就是进行认证 调用自己的 命名空间 固定写法 -->
<xsd:schema xmlns="http://www.xh.cn/xml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xh.cn/xml" elementFormDefault="qualified">
<!-- 定义一个 根节点 students type是变量 用在xsd文件下的 其他节点 来调用 类似别名 -->
<xsd:element name="students" type="studentsType"/>
<!-- 在students根节点的基础上 添加 子元素 -->
<xsd:complexType name="studentsType">
<xsd:sequence>
<!-- 在students下 定义一个子节点 student 加上约束 minOccurs 是最少定义多少个 student节点 maxOccurs是最大定义多少个节点 0=可以不定义 1代表最少定义一个 .... unbounded=无限个 -->
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- 在student下 定义一个子节点 name age sex 创建xml的也要按照 这个顺序 -->
<xsd:complexType name="studentType">
<xsd:sequence>
<!-- 定义一个name 节点 内容是字符串类型 -->
<xsd:element name="name" type="xsd:string"/>
<!-- 定义一个age 起一个别名 在下面 进行 进行约束添加-->
<xsd:element name="age" type="ageType" />
<!-- 定义一个sex 起一个别名 在下面 进行 进行约束添加-->
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<!-- 给当前节点 student 添加 属性 number required=唯一 -->
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<!-- 给number属性添加 约束 xsd:string 字符串类型 value="p_\d{4}" =正则表达式 -->
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<!-- 文本内容 必须是 p_ 开头的 然后跟上4位数字 -->
<xsd:pattern value="p_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
<!--给 age 节点添加 约束 -->
<xsd:simpleType name="ageType">
<!-- 文本内容 必须是 数字类型-->
<xsd:restriction base="xsd:integer">
<!-- 数值 最小 0 -->
<xsd:minInclusive value="0"/>
<!-- 数值 最大256 -->
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<!--给 sex节点添加 约束 -->
<xsd:simpleType name="sexType">
<!-- 文本内容 必须是 字符串类型-->
<xsd:restriction base="xsd:string">
<!-- 使用的是 枚举 内容必须是male 或者 female 二选一 -->
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
xml约束导入
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 1.填写xml文档的根元素 要导入文件的约束 根 2.引入xsi前缀. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 固定的 3.为每一个xsd约束声明一个前缀,这个前缀 就是在你的xsd文件中声明的 xmlns="http://www.xh.cn/xml" 4.引入xsd文件命名空间 也就是路径. xsi:schemaLocation="http://www.xh.cn/xml student.xsd" -->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xh.cn/xml" xsi:schemaLocation="http://www.xh.cn/xml student.xsd">
<!-- 按照约束 来写xml 文件 节点-->
<student number="p_0001">
<name>tom1</name>
<age>18</age>
<sex>male</sex>
</student>
</students>
多个xsd文件 需要起别名来其引入,会发现 根节没有约束 如果非要进行 根约束 那么 只能从多个约束文件中选一个使用别名:来进行根节点约束 但是这样的话 节点内容 就必须按照 别名文件的约束走 其他的约束无效 所以 自己根据情况 选择 如果是多约束那么 就无法限制根节点 如果是单个文件那么就能限制 根节点(整个xml)
说了这么多估计你也看不懂…
<?xml version="1.0" encoding="UTF-8" ?>
<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.xh.cn/xml" xmlns:b="http://www.xh_1.cn/xml" xsi:schemaLocation=" http://www.xh.cn/xml student.xsd http://www.xh_1.cn/xml student_1.xsd ">
<!-- 按照约束 来写xml 文件 节点-->
<a:students>
<a:student number="p_1234">
<a:name>胡安民</a:name>
<a:age>20</a:age>
<a:sex>female</a:sex>
</a:student>
</a:students>
<b:students>
<b:student number="p_1234">
<b:name>胡安民</b:name>
<b:age>20</b:age>
<b:sex>female</b:sex>
</b:student>
</b:students>
</xml>
没事看不懂 跳过就行了 会不会不影响 难道给自己找麻烦吗?? 一般这都不是我们写的 我们只要会操作xml就行了
添加dom4j依赖 如果有了就不用添加了 还有其他很多种操作xml的方式…
我这里提供下载地方:
链接:https://pan.baidu.com/s/1W5EdX7tgjS_V6lEtMcnmvw
提取码:1234
Maven
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
@Test
public void showriz() {
// 创建文档对象。
Document document = DocumentHelper.createDocument();
// 文档增加第一个节点,即根节点,一个文档只能有一个根节点,多加出错 然后创建的其他节点都是在根节点内
Element root = document.addElement("xml_gen");
// 添加注释 (可有可无) 注释是在节点上方 的 <!--?? -->
root.addComment("第一个技能");
// 根节点下添加节点
Element first = root.addElement("day_1");
// 节点添加属性
first.addAttribute("name", "独孤九剑");
// 节点下添加节点
Element info = first.addElement("info");
// 节点设置内容数据
info.setText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。");
// 同上 增加其他节点,内容,属性等
Element second = root.addElement("day_2");
second.addAttribute("name", "葵花宝典");
Element info2 = second.addElement("info");
info2.setText("宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。");
// 创建节点
Element third = DocumentHelper.createElement("skill");
// 将节点加入到根节点中
root.add(third);
// 创建属性
Attribute name = DocumentHelper.createAttribute(third, "name", "北冥神功");
// 将属性加入到节点上
third.add(name);
// 创建子节点并加入到节点中
Element info3 = DocumentHelper.createElement("day_1");
info3.setText("逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。");
third.add(info3);
//将document对象内的内容 写入到文件里
FileOutputStream file=null;
OutputStreamWriter fos=null;
XMLWriter writer=null;
try {
// 创建格式化类
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式,默认UTF-8
format.setEncoding("UTF-8");
// 创建输出流文件不存在就创建
file = new FileOutputStream("C:\\Users\\12841\\Desktop\\test\\day.xml");
fos=new OutputStreamWriter(file,"utf-8");
// 创建xml输出流
writer = new XMLWriter(fos, format);
// 生成xml文件
writer.write(document);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
writer.close();
fos.close();
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后结果:
如果需要添加文档 的DocType
// 设置文档DocType,这里为了举例,添加hibernate的DocType
document.addDocType("hibernate-configuration",
"-//Hibernate/Hibernate Configuration DTD 3.0//EN", "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");
需要dom4j 依赖
链接:https://pan.baidu.com/s/1W5EdX7tgjS_V6lEtMcnmvw
提取码:1234
Maven
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
我的xml文件
<?xml version="1.0" encoding="utf-8" ?>
<xml>
<student>
<firstname>cxx1</firstname>
<firstname>cxx1----</firstname>
<lastname>Bob1</lastname>
<nickname>stars1</nickname>
<marks>85</marks>
</student>
<student rollno="493">
<firstname>cxx2</firstname>
<lastname>Bob2</lastname>
<nickname>stars2</nickname>
<marks>85</marks>
</student>
<student rollno="593">
<firstname>cxx3</firstname>
<lastname>Bob3</lastname>
<nickname>stars3</nickname>
<marks>85</marks>
</student>
</xml>
常用的 方法
getName() 获取节点名称 或者 属性名称
getValue()获取节点 属性值
getText().trim() 获取当前节点的文本内容 如果内容为空则返回一个空字符串而不是null
getStringValue().trim() 获取当前节点和之下节点所有文本 然后内容连接成字符串.
//获取项目路径
String ph=System.getProperty("user.dir"); //获取当前的顶级目录 的绝对路径
//将顶级目录的盘符\ 进行转义 成\\ java能识别的盘符
String ph1=ph.replace("\\","\\\\");
//添加文件的相对路径 然后将结果和绝对路径进行对比下看看对不对
ph1+="\\\\src\\\\main\\\\src\\\\cn\\\\htsa\\\\www\\\\test\\\\xml_1.xml";
System.out.print(ph1);
//如果打包成war 你的文件一般情况都是在classes下
String ph=request.getServletContext().getRealPath("/")+"WEB-INF" +"\\classes\\xml_1.xml ";
//1.创建Reader对象
SAXReader reader = new SAXReader();
//读取xml文件内容
Document document = reader.read(new File(ph1));
//或者 这种方式 只要你的文件在Resources目录里 不管在不在服务器端 都能获取到
InputStream resourceAsStream = 当前类名.class.getClassLoader().getResourceAsStream("beans.xml");
try {
document = reader.read(resourceAsStream);
} catch (DocumentException e) {
e.printStackTrace();
}
如果是xml字符串的话
Document document= DocumentHelper.parseText(s1);
//3.获取根节点
Element rootElement = document.getRootElement();
elementIterator获取节点下第一层节点
Iterator iterator = rootElement.elementIterator();
while (iterator.hasNext()){
//获取节点的对象
Element stu = (Element) iterator.next();
System.out.print(stu.getName());//获取节点名称
// attributes 返回节点的属性集合
List<Attribute> attributes = stu.attributes();
//获取节点 属性的名称 和 值
for (Attribute attribute : attributes) {
System.out.print( attribute.getName());
System.out.println(attribute.getValue());
}
//继续往下遍历
Iterator iterator1 = stu.elementIterator();
while (iterator1.hasNext()){
Element stuChild = (Element) iterator1.next();
System.out.println("节点名:"+stuChild.getName()+"---节点值:"+stuChild.getStringValue());
}
}
节点名:firstname—节点值:cxx1----
节点名:lastname—节点值:Bob1
节点名:nickname—节点值:stars1
节点名:marks—节点值:85
studentrollno493
节点名:firstname—节点值:cxx2
节点名:lastname—节点值:Bob2
节点名:nickname—节点值:stars2
节点名:marks—节点值:85
studentrollno593
节点名:firstname—节点值:cxx3
节点名:lastname—节点值:Bob3
节点名:nickname—节点值:stars3
节点名:marks—节点值:85
根据使用情况进行拆装代码
private Map<String, String> parseXml(String xml){
//解析结果
Map<String,String> resultMap = new HashMap<String,String>();
try {
// 将xml String转化为xml
Document document = DocumentHelper.parseText(xml);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 获取各个节点中的数据
for (Element e : elementList) {
resultMap.put(e.getName(), e.getText());
}
}catch(Exception e){
e.printStackTrace();
}
return resultMap;
}
但是如果是在服务端 使用的是mvc框架的方式的话那么
//将别人传来的xml文件解析结果存储在HashMap中 然后在返回前端进行处理
//当然你在后端处理也可以 不返回了就行了
@SuppressWarnings(path = "/wx_xinxi",method = {RequestMethod.GET})
public Map<String, String> parseXml(HttpServletRequest request) throws Exception {
Map<String, String> map = new HashMap<String, String>();
// 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList) {
map.put(e.getName(), e.getText());
}
// 释放资源
inputStream.close();
return map;
}
String xml="<messge>"+
"<name>hu</name>"+
"<age>22</age>" +
"</messge>";
Document document= DocumentHelper.parseText(xml);
List list = document.selectNodes("/messge");
// 查询 document的内容
System.out.println("原xml");
String s = document.asXML();
<?xml version=“1.0” encoding=“UTF-8”?>
<messge><name>hu</name><age>22</age></messge>
自动会给你补上<?xml version=“1.0” encoding=“UTF-8”?>
document.selectNodes(路径) 来选取节点 返回的是list 记住只有document对象中才有selectNodes方法
添加依赖
dom4j-1.6.1.jar
链接:https://pan.baidu.com/s/1W5EdX7tgjS_V6lEtMcnmvw
提取码:1234
jaxen-1.2.0.jar
链接:https://pan.baidu.com/s/14M4TWD-ksgzKfIgb8JVlZg
提取码:1234
maven
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
我的xml
<?xml version="1.0" encoding="UTF-8"?>
<xml_gen>
<day_1 name="独孤九剑">
<info age="22">为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。</info>
<name num="10" num1="11">哈哈哈1</name>
<li>
<li_1>我是内</li_1>
</li>
<info age="33">要有风清扬、令狐冲。</info>
</day_1>
<day_2 name="葵花宝典">
<info age="男">宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。</info>
<info age="女">首先要自宫净身。</info>
<name num="50">哈哈哈2</name>
</day_2>
<skill name="北冥神功">
<day_1 name="wox">逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。</day_1>
<name num="100">
<age>男</age>
</name>
</skill>
</xml_gen>
先获取获取document对象 在上面dom4j有教程怎么获取的
常用的 方法
getName() 获取节点名称 或者 属性名称
getValue()获取节点 属性值
getText().trim() 获取当前节点的文本内容 如果内容为空则返回一个空字符串而不是null
getStringValue().trim() 获取当前节点和之下节点所有文本然后内容连接成字符串.
/就是绝对匹配的 //就是模糊匹配(所有)
注意的是: 比如/a/b 此时b下面还有b 那么他不会匹配b下面的子节点b 但是如果换成/a//b 那么b的子节b 也会匹配的
/a//b 意思就是a节点下的所有b节点
//b就是所有b节点 包括子节点
/a/b/c 意思就是a下的b节点下的c节点 不会在往下了
匹配xml_gen节点下的day_1节点下所有包含name属性的节点
/xml_gen/day_1/@name
匹配所有是name属性的节点
//@name
匹配所有day_1节点下是name属性的节点
//day_1/@name
匹配所有day_1节点 属性是name=wox 的节点
//day_1[@name=‘wox’]
匹配xml_gen节点下所有/name节点属性num>40 下的节点age
/xml_gen//name[@num>40]
匹配所有info节点的第一个节点
//info[1]
匹配xml_gen节点下的day_2节点下的第一个info节点
/xml_gen/day_2/info[1]
匹配xml_gen节点下day_1节点下info节点的上一级节点
/xml_gen/day_1/info/…
匹配所有info的上一级节点
//info/…
匹配xml_gen节点下day_2节点下info节点的最后一个
/xml_gen/day_2/info[last()]
匹配所有节点
/*
匹配xml_gen节点下day_1节点下所有元素包括子元素…
/xml_gen/day_1//*
匹配xml_gen节点下所有带有属性的info节点
/xml_gen//info[@/*]
匹配day_1下的第一个info标签 和 day_2下的name标签
//day_1/info[1]|//day_2/name
List list = document.selectNodes("/xml_gen/day_1/name");
for (Iterator it = list.iterator(); it.hasNext();) {
Element stuChild = (Element) it.next();//节点对象
//获取此节点下所有text
System.out.println(stuChild.getStringValue().trim());
// 使用Element节点对象 可以获取所有此节点上的 属性名和值
List<Attribute> attributes = stuChild.attributes();
for (Attribute attribute : attributes) {
System.out.print("属性名称:"+attribute.getName());
System.out.println("属性值:"+attribute.getValue());
}
}
哈哈哈1
属性名称:num属性值:10
属性名称:num1属性值:11
List list = document.selectNodes("/xml_gen//@name");
for (Iterator it = list.iterator(); it.hasNext();) {
Attribute attributes = (Attribute) it.next();//节点对象
System.out.println(attributes.getName());
System.out.println(attributes.getValue());
}
name
独孤九剑
name
葵花宝典
name
北冥神功
name
wox
List list = document.selectNodes("/xml_gen/day_1/*");
for (Iterator it = list.iterator(); it.hasNext();) {
Element element = ( Element) it.next();//节点对象
System.out.println(element.getStringValue().trim());
}
为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。
哈哈哈1
我是内
要有风清扬、令狐冲。
使用XPath 来选择对象
这里注意的是 无论是 删除还是修改 都是在内存中做的操作 没有对原文件进行 操作 所以需要将内存中的修改或者删除后的xml对象重新写入到原文件中 覆盖一遍才能成功
先获取获取document对象 在上面dom4j有教程怎么获取的
List list = document.selectNodes("//day_1//info");
for (Iterator it = list.iterator(); it.hasNext();) {
Element stuChild = (Element) it.next();
//更新节点 day_1下的所有info的文本内容
stuChild.setText("只要998");
}
List list = document.selectNodes("//day_1//info/@*");
for (Iterator it = list.iterator(); it.hasNext();) {
Attribute attr = (Attribute) it.next();//属性对象
if(attr.getName()=="age"){
attr.setValue("123");
}
}
List list = document.selectNodes("//day_1//info");
for (Iterator it = list.iterator(); it.hasNext();) {
Element stuChild = (Element) it.next();
stuChild.setName("info1");
}
List list = document.selectNodes("//day_1//info");
for (Iterator it = list.iterator(); it.hasNext();) {
Element stuChild = (Element) it.next();
//添加num 属性 值还是age的值不变
stuChild.addAttribute("num", stuChild.attribute("age").getValue());
//然后将age属性删除
stuChild.remove(stuChild.attribute("age"));
}
使用XPath 来选择对象
这里注意的是 无论是 删除还是修改 都是在内存中做的操作 没有对原文件进行 操作 所以需要将内存中的修改或者删除后的xml对象重新写入到原文件中 覆盖一遍才能成功
先获取获取document对象 在上面dom4j有教程怎么获取的
//我删除 day_1节点下的所有info节点
List list = document.selectNodes("//day_1//info");
for (Iterator it = list.iterator(); it.hasNext();) {
Element stuChild = (Element) it.next();
//获取到info节点的父节点 然后删除父级点下的所有info节点
if(stuChild.getParent().remove(stuChild)){
System.out.println("删除成功");
}
}
List list = document.selectNodes("//day_1//info");
for (Iterator it = list.iterator(); it.hasNext();) {
Element stuChild = (Element) it.next();
//删除所有day_1节点下的所有info节点的age属性
if(stuChild.remove(stuChild.attribute("age"))){
System.out.println("删除成功");
}
}
先获取获取document对象 在上面dom4j有教程怎么获取的
@Test
public void show() throws Exception {
String xml="<messge>"+
"<name>hu</name>"+
"<age>22</age>" +
"</messge>";
Document document= DocumentHelper.parseText(xml);
List list = document.selectNodes("/messge");
// 查询 document的内容
System.out.println("原xml");
String s = document.asXML();
System.out.println(s);
for (Iterator it = list.iterator(); it.hasNext();) {
Element stuChild = (Element) it.next();//节点对象
if (stuChild.getName().equals("messge")){
// 添加节点标签
Element element = stuChild.addElement("money");
// 添加节点标签 Text
element.addText("1000");
// 添加节点属性
element.addAttribute("language","cn");
}
}
// 查询 document的内容
System.out.println("添加后xml");
String s1 = document.asXML();
System.out.println(s1);
}
原xml
<?xml version=“1.0” encoding=“UTF-8”?>
<messge> <name>hu</name> <age>22</age> </messge> 添加后xml <?xml version=“1.0” encoding=“UTF-8”?> <messge <name>hu</name> <age>22</age> <money language=“cn”>1000</money> </messge>
FileOutputStream file=null;
OutputStreamWriter fos=null;
XMLWriter writer=null;
try {
// 创建格式化类
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式,默认UTF-8
format.setEncoding("UTF-8");
// 你要修改或者删除或者创建的xml位置 如果不存在就创建
file = new FileOutputStream("C:\\Users\\12841\\Desktop\\test\\day.xml");
fos=new OutputStreamWriter(file,"utf-8");
// 创建xml输出流
writer = new XMLWriter(fos, format);
// 生成xml文件
writer.write(document);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
writer.close();
fos.close();
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45203607/article/details/120235712
内容来源于网络,如有侵权,请联系作者删除!