XML
Extensible Market Language 可擴(kuò)展標(biāo)記語(yǔ)言
- XML是特殊文件形式,結(jié)構(gòu)化文件
- 做數(shù)據(jù)保存
- 做信息交互和共享的(重點(diǎn),數(shù)據(jù)傳輸)
- 做系統(tǒng)的配置文件數(shù)據(jù)
XML作用
- 數(shù)據(jù)交換:不同的計(jì)算機(jī)語(yǔ)言之間,不同的操作系統(tǒng)之間,不同的數(shù)據(jù)庫(kù)之間,進(jìn)行數(shù)據(jù)交換

-
配置文件:在后期我們主要用于各種框架的配置文件
<?xml version="1.0" encoding="utf-8" ?> <server-config> <default-config> <property name = "driverClass">com.zimo.jdbc.Driver</property> <property name = "jdbcUrl">jdbc:mysql://localhost:3306/test</property> <property name = "user">root</property> <property name = "password">123456</property> </default-config> </server-config>
XML的特點(diǎn)
- 用于數(shù)據(jù)交互,用于數(shù)據(jù)的存儲(chǔ),用于做系統(tǒng)的配置文件
- 區(qū)分大小寫
- 非常嚴(yán)謹(jǐn),只要有錯(cuò)誤,解析器就不能解析
- 可以擴(kuò)展的,所有的標(biāo)簽都是程序員自己創(chuàng)建出來(lái)
- XML文件的后綴為.xml
注意:XML以后通過(guò)Java來(lái)進(jìn)行解析,很少直接在瀏覽器上顯示
XML由七種組成元素構(gòu)成:
-
聲明(抬頭):必須在第一行
version:指定XML文件使用的版本,取值是1.0encoding:當(dāng)前xml使用的編碼(字符集)standalone:指定當(dāng)前這個(gè)XML文件是否是一個(gè)獨(dú)立的文件,省略的,默認(rèn)是獨(dú)立文件 -
元素(標(biāo)簽)
語(yǔ)法:
<a>開(kāi)頭 內(nèi)容 </a>結(jié)尾主體部分:標(biāo)簽分為有主體和沒(méi)有主體的兩種,如果沒(méi)有主題,標(biāo)簽一定要結(jié)束
大小寫:區(qū)分大小寫
命名:不能由空格,不能有冒號(hào)
根元素:有且只有一個(gè)根元素
-
屬性
例如:
<person id = "10086"> 注釋
實(shí)體字符

CDATA字符數(shù)據(jù)區(qū)
處理指令
<?xml version="1.0" encoding="UTF-8" ?> <!-- 1.聲明 抬頭 -->
<!-- 2.注釋 這就是注釋 -->
<!-- 3.標(biāo)簽(元素) 一個(gè)XML文件只能有一個(gè)根標(biāo)簽 -->
<!-- 7.實(shí)體字符 導(dǎo)入外部css樣式,控制xml效果,沒(méi)用,xml不是為了展示 -->
<?xml-stylesheet type="text/css" href="student.css" ?>
<Student>
<!-- 4.屬性信息 id,desc -->
<name id = "1" desc = "高富帥">zimo</name>
<age>18</age>
<!-- 5.實(shí)體字符 不能使用特殊字符,必須使用轉(zhuǎn)義實(shí)體字符 -->
<sql><!-- select * from student where age > 18 && age < 30; -->
select * from student where age > 18 && age < 30;
</sql>
<!-- 6.實(shí)體字符 -->
<sql>
<![CDATA[
select * from student where age > 18 && age < 30;
]]>
</sql>
</Student>
版本說(shuō)明
w3c在1988年2月發(fā)布1.0版本,2004年2月發(fā)布1.1版本,因?yàn)?.1不能向下兼容1.0版本,所以1.1沒(méi)有人用,在2004年2月w3c又發(fā)布了1.0版本的第三版
-
小結(jié):
-
聲明有哪兩個(gè)常用屬性?
version、encoding
-
一個(gè)XML有幾個(gè)根元素?
一個(gè)
-
XML標(biāo)簽命名不能有什么符號(hào)?
空格、冒號(hào)
-
-
一個(gè)良好的XML有以下特點(diǎn)
- 必須以XML聲明開(kāi)頭
- 必須擁有唯一的根元素
- 開(kāi)始標(biāo)簽必須與結(jié)束標(biāo)簽相匹配
- 元素對(duì)大小寫敏感
- 所有的元素必須關(guān)閉
- 所有的元素必須正確地嵌套
- 特殊字符必須使用實(shí)體字符或使用字符數(shù)據(jù)區(qū)
XML約束:
XML文件的標(biāo)簽和屬性可以隨意擴(kuò)展,有時(shí)我們必須要限制每個(gè)文檔有哪些元素,每個(gè)元素都有哪些子元素,每個(gè)元素有哪些屬性等,從而保證XML文檔格式和數(shù)據(jù)的正確性和規(guī)范性
DTD約束
- DTD:Document Type Definiation 文檔類型定義
- 作用:純文本文件,指定了XML約束規(guī)則
| 導(dǎo)入DTD文件的兩種格式 | 說(shuō)明 |
|---|---|
| <!DOCTYPE 根元素 SYSTEM "DTD文件"> | 系統(tǒng)DTD文件,通常個(gè)人或公司內(nèi)部使用 |
| <!DOCTYPE 根元素 PUBLIC "文件描述" "DTD文件"> | 公有的DTD文件,在互聯(lián)網(wǎng)上廣泛使用的DTD |
如:hibernate框架的導(dǎo)入方式
<!DOCTYPE hibernate-configuration PUBLIC <!-- hibernate-configuration 根元素 -->
"-//Hibernate/Hibrenate Configuration DTD 3.0//EN" <!-- DTD文件描述 -->
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- DTD文件 -->
<hibernate-configuration>
</hibernate-configuration>
自定義books.dtd文件
<!ELEMENT 書(shū)架 (書(shū)+) > // 書(shū)架
<!ELEMENT 書(shū) (書(shū)名, 作者, 售價(jià)) > // 至少一本書(shū)
<!ELEMENT 書(shū)名 (#PCDATA) > // 書(shū)名
<!ELEMENT 作者 (#PCDATA) > // 作者
<!ELEMENT 售價(jià) (#PCDATA) > // 售價(jià)
使用books.dtd文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 書(shū)架 SYSTEM "books.dtd">
<書(shū)架>
<書(shū)>
<書(shū)名></書(shū)名>
<作者></作者>
<售價(jià)></售價(jià)>
</書(shū)>
</書(shū)架>
DTD約束:只能約束標(biāo)簽,無(wú)法約束類型
Schema約束
- DTD的不足:
- 不能驗(yàn)證數(shù)據(jù)類型
- 因?yàn)镈TD是一個(gè)文本文件,本身不能驗(yàn)證是否正確
Schema特點(diǎn)
- 約束文件本身也是一個(gè)XML文件,它本身也會(huì)被其它xsd文檔約束
- 內(nèi)置多種數(shù)據(jù)類型,可以檢查數(shù)據(jù)類型是否正確
- 支持命名空間,一個(gè)XML文件可以同時(shí)引入多個(gè)xsd的約束文件,讓約束規(guī)則重用
- 擴(kuò)展名為xsd:XML Schema Definition
約束文件擴(kuò)展名XML模式定義:xsd
約束文件本身也是XML文件,所以也有根元素,根元素名字叫:Schema
模式文檔和實(shí)力文檔
- 模式文檔:指定約束的XML文檔(類似:類)
- 實(shí)例文檔:被約束的XML文檔(類似:對(duì)象)
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w2.org/2001/XMLSchema"
targetNamespace="http://www.zimo.cn"
elementFormDefault="qualified">
<!-- targetNamespace:聲明約束文檔的地址(命名空間) -->
<element name = "書(shū)架">
<!-- 寫子元素 -->
<complexType>
<!-- maxOccurs='unbounded':書(shū)架下的子元素可以有任意多個(gè) -->
<sequence maxOccurs='unbounded'>
<element name="書(shū)">
<!-- 寫子元素 -->
<complexType>
<!-- 子元素必須有序 -->
<sequence>
<element name="書(shū)名" type='string' />
<element name="作者" type='string' />
<element name="售價(jià)" type='double' />
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
<?xml version="1.0" encoding="UTF-8" ?>
<書(shū)架 xmlns="http://www.zimo.cn"
xmlns:xsi="http://www.w2.org/2001/XMLSchema"
xsi:schemaLocation="http://www.zimo.cn books.xsd">
<書(shū)>
<書(shū)名>11</書(shū)名>
<作者>aa</作者>
<售價(jià)>99.8</售價(jià)>
</書(shū)>
<書(shū)>
<書(shū)名>22</書(shū)名>
<作者>bb</作者>
<售價(jià)>88.8</售價(jià)>
</書(shū)>
</書(shū)架>
XML的解析方式
- DOM解析:文檔對(duì)象模型(面向?qū)ο蠼馕龇绞剑?
- 優(yōu)點(diǎn):將整個(gè)XML文件加載到內(nèi)存中,生成DOM樹(shù),可以隨意訪問(wèn)任意節(jié)點(diǎn)
- 缺點(diǎn):占內(nèi)存,XML過(guò)大可能會(huì)內(nèi)存溢出
- SAX解析:
- 事件驅(qū)動(dòng)型解析方式,讀取一行就解析一行,釋放內(nèi)存??梢越馕鋈我獯笮〉腦ML文件
- 缺點(diǎn):使用過(guò)不能再次訪問(wèn),不能修改,只能查詢
Java中的DOM解析開(kāi)發(fā)包
- JAXP:Oracle官方提供API,同時(shí)支持DOM和SAX
- JDOM:開(kāi)源項(xiàng)目,基于樹(shù)形結(jié)構(gòu),利用純Java的技術(shù)對(duì)XML文檔實(shí)現(xiàn)解析、生成、序列化及多種操作
-
:是JDOM升級(jí)版,性能優(yōu)異,功能強(qiáng)大,使用簡(jiǎn)單,性能超過(guò)sun公司的dom技術(shù),Habrenate也是用它讀寫配置
- Jsoup:是一款Java和HTML和XML解析器,可以解析URL地址、HTML文本內(nèi)容。
DOM4j中DOM樹(shù)的API
| 組成 | 說(shuō)明 |
|---|---|
| Document | 當(dāng)前解析的XML文檔對(duì)象 |
| Node | XML中節(jié)點(diǎn),它是其他所有節(jié)點(diǎn)對(duì)象的父接口 |
| Element | 代表一個(gè)元素(標(biāo)簽) |
| Attribute | 代表一個(gè)屬性 |
| Text | 代表標(biāo)簽中文本 |
Dom4j安裝步驟
- 下載dom4j框架,jar包
- 把dom4j核心jar包導(dǎo)入項(xiàng)目
- 項(xiàng)目中創(chuàng)建文件夾:lib
- 將dom4j.jar復(fù)制到lib中
- 在jar文件夾上右鍵,Add As Library
- 類中導(dǎo)包使用
-
Java提供了Class下的一個(gè)方法:
public InputStream getResourceAsStream(String path)| -- 用于加載文件稱為一個(gè)字節(jié)輸入流返回??!
-
Document文檔:
-
Element getRootElement():獲取根元素 -
String getName():取元素名稱 -
List<Element> elements():獲取當(dāng)前元素下的全部子元素(一級(jí)) -
List<Element> elements(String name):獲取當(dāng)前元素下指定名稱的全部子元素(一級(jí)) -
Element element(String name):獲取當(dāng)前元素下的指定名稱的某個(gè)子元素,默認(rèn)取第一個(gè)
-
-
Element元素的API:
-
List<Attribute> attributes():獲取元素的全部屬性對(duì)象 -
Attribute attribute(String name):根據(jù)名稱獲取某個(gè)元素的屬性對(duì)象 -
String attributeValue(String var1):直接獲取某個(gè)元素的某個(gè)屬性名稱的值
-
-
Attribute對(duì)象的API:
-
String getName():獲取屬性名稱 -
String getValue():獲取屬性值
-
-
Element:
-
String elementText(String name):可以直接獲取當(dāng)前元素的子元素的文本內(nèi)容 -
String elementTextTrim(String name):去前后空格,直接獲取當(dāng)前元素的子元素的文本內(nèi)容 -
String getText():直接獲取當(dāng)前文本內(nèi)容 -
String getTextTrim():去前后空格,直接獲取當(dāng)前文本內(nèi)容
-
案例:
/* Contact類 */
/**
* <contact id = "1" vip = "true">
* <name>潘金蓮</name>
* <sex>女</sex>
* <email>panpan@zimo.com</email>
* </contact>
*/
public class Contact{
private int id;
private boolean vip;
private String name;
private char sex;
private String email;
public Contact(){
}
public Contact(int id, boolean vip, String name, char sex, String email){
this.id = id;
this.vip = vip;
this.name = name;
this.sex = sex;
this.email = email;
}
// 各個(gè)屬性的get,set方法.....
}
package com.zimo.Dom4j案例解析;
/**
* Dom4j解析XML文件:Contacts.xml成為一個(gè)Java對(duì)象(集合對(duì)象)
* Contacts.xml 解析成 ===>>> List<Contact>
* 分析:
* 1.定義一個(gè)聯(lián)系人封裝聯(lián)系人數(shù)據(jù)
* 2.解析成List集合
*/
public class Dom4JDemo{
public static void main(String args[]) throws Exception{
// 1.創(chuàng)建一個(gè)dom4j的解析器對(duì)象:代表整個(gè)dom4j框架
SAXReader sa = new SAXReader();
// 2.通過(guò)解析器對(duì)象去加載xml文件數(shù)據(jù),成為一個(gè)document文檔樹(shù)對(duì)象
Document d = sa.read(new File("zimo/src/Contacts.xml"));
// 3.獲取根元素
Element eRoot = d.getRootElement();
// 4.獲取根元素下的全部子元素
List<Element> eSon = eRoot.elements();
// 5.遍歷子元素 封裝成list集合對(duì)象
List<Contact> conList = new ArrayList();
if(eSon != null && eSon.size() > 0){
for(Element e : eSon){
int id = Integer.valueOf(e.attributeValue("id"));
boolean vip = Boolean.valueOf(e.attributeValue("vip"));
String name = String.valueOf(e.elementText("name"));
char sex = e.elementText("sex").charAt(0);
String email = String.valueOf(e.elementText("email"));
Contact contact = new Contact(id,vip,name,sex,email);
conList.add(contact);
}
}
}
}
Dom4j中的XPath
作用:一種用于快速查找XML元素的路徑表達(dá)式,是用于方便的檢索XML文件中的信息
-
XPath使用步驟
- 導(dǎo)入dom4j框架(XPath依賴dom4j技術(shù))
- 導(dǎo)入XPath獨(dú)有的框架包。jaxen.jar
-
XPath常用的API:
-
List<Node> selectNodes(String var1):檢索出一批節(jié)點(diǎn)集合 -
Node selectSingleNode(String var1):檢索出一個(gè)節(jié)點(diǎn)返回
-
-
XPath提供四種檢索數(shù)據(jù)的寫法
絕對(duì)路徑:/根元素/子元素/子元素
相對(duì)路徑:./子元素/子元素(.代表了當(dāng)前元素)
-
全文搜索:
//元素在全文查找這個(gè)元素//元素1/元素2在全文招元素1下面一級(jí)元素2//元素1//元素2在全文找元素1下面的全部元素2 -
屬性查找:
//@屬性名稱在全文檢索屬性對(duì)象//元素[@屬性名稱]在全文檢索包含該屬性的元素對(duì)象//元素[@屬性名稱=值]在全文檢索包含該屬性的元素且屬性值為該值的元素對(duì)象
public class Dom4JDemo{
public static void main(String args[]) throws Exception{
// 1.創(chuàng)建一個(gè)dom4j的解析器對(duì)象
SAXReader sa = new SAXReader();
// 2.通過(guò)解析器對(duì)象去加載xml文件數(shù)據(jù),成為一個(gè)document文檔樹(shù)對(duì)象
InputStream is = Dom4JDemo.class.getResourceAsStream("/Contacts.xml")
Document d = sa.read(is);
// 3.1 使用絕對(duì)路徑定位全部的name名稱
List<Node> nameNodes = d.selectNodes("/contact/name"); // 從文檔根路徑開(kāi)始
for(Node n : nameNode){
System.out.println(n.getText());
}
--------------------------------------------------------------------------
// 3.2 使用相對(duì)路徑定位
// 得到根元素對(duì)象
Element root = document.getRootElement();
// 從根元素開(kāi)始檢索
List<Node> nameNodes = root.selectNodes("./name");
--------------------------------------------------------------------------
// 3.3全文檢索
List<Node> nameNodes = document.selectNodes("http://name"); // 全文所有name節(jié)點(diǎn)
List<Node> nameNodes = document.selectNodes("http://contact/name"); // 全文所有contact/name節(jié)點(diǎn)
List<Node> nameNodes = document.selectNodes("http://contact//name"); // 全文contact下所有name節(jié)點(diǎn)
--------------------------------------------------------------------------
// 3.3全文檢索-所有屬性
List<Node> attr = document.sattelectNodes("http://@id"); // 全文所有id屬性對(duì)象
for(Node att : attr){
Attribute a = (Attribute) att;
System.out.println(n.getText());
}
List<Node> nodeEles = document.selectNodes("http://contact[@id]"); // 全文所有contact下包含id屬性的
for(Node nodeEles : nodeEles){
System.out.println(nodeEles.getName());
}
Node nodeEle = document.selectSingleNode("http://contact[@id = 1]"); // 全文所有contact下包含id = 1屬性的
Element ele = (Element) nodeEle;
System.out.println(ele.elementTextTrim("name"));
}
解析MyBatis配置文件

public class ParseXMLConfig{
public void parseXML() throws Exception{
// 1.創(chuàng)建一個(gè)解析器對(duì)象
SAXReader sr = new SAXReader();
// 2.加載類路徑下的xml文件成為一個(gè)document文檔對(duì)象
Document d = sr.read(ParseXMLConfig.class.getResourceAsStream("/sqlMapConfig.xml"));
// 3.得到根元素對(duì)象
Element root = d.getRootElement();
// 4.獲取子元素environments
Element env = root.element("environments");
// 5.獲取子元素environment
Element en = env.element("environment");
// 6.獲取子元素dataSource
Element data = en.element("dataSource");
// 7.獲取dataSource下的全部子元素
List<Element> properties = data.elements();
// 8.遍歷屬性
for(Element p : properties){
System.out.println(p.attributeValue("name") + "===" + p.attributeValue("value"))
}
}
}
工廠模式
- 工廠模式(Factory Pattern)是Java中最常用的設(shè)計(jì)模式之一
- 這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的方式
- 之前我們創(chuàng)建類對(duì)象時(shí),都是new對(duì)象的形式創(chuàng)建,除了new以外工廠模式也可以創(chuàng)建
工廠模式的作用
- 對(duì)象通過(guò)工廠的方法創(chuàng)建返回,工廠的方法可以為該對(duì)象進(jìn)行加工和數(shù)據(jù)注入
- 可以實(shí)現(xiàn)類與類之間的解耦合操作(核心思想)
小結(jié):
- 優(yōu)點(diǎn):工廠模式的存在可以改變創(chuàng)建對(duì)象的方式,解決類與類之間的耦合性
- 缺點(diǎn):工廠設(shè)計(jì)模式多了一個(gè)工廠類
public abstract class Animal{
public abstract void run();
}
public class Car extends Animal{
@Override
public void run(){
System.out.println("能抓魚(yú)");
}
}
public class Dog extends Animal{
@Override
public void run(){
System.out.println("看門");
}
}
- 工廠設(shè)計(jì)模式
public class FactoryPattern{
// 不用動(dòng)其他模塊的代碼,統(tǒng)一由工廠調(diào)控
public static Animal createAnimal(){
return new Dog();
}
public static Animal createAnimal1(){
return new Cat();
}
}
public static void main(String args[]){
// 舊方式
Animal a = new Cat();
a.run();
// 工廠模式
Animal a = FactoryPattern.createAnimal();
a.run();
}
裝飾模式
在不改變?cè)瓉?lái)類,不適用繼承的基礎(chǔ)上,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)類的功能
思想:創(chuàng)建要給新類,包裝原始類,從而在新類中提升原來(lái)的功能
小結(jié):裝飾類可以在不改變?cè)惖幕A(chǔ)上對(duì)類中的方法進(jìn)行擴(kuò)展增強(qiáng),實(shí)現(xiàn)原則為:
- 定義父類
- 定義原始類,繼承父類,定義功能
- 定義裝飾類,繼承父類,包裝原始類,增強(qiáng)功能
Commons-io包的使用
Commons-io是apache開(kāi)源基金組織提供的一組有關(guān)IO操作的類庫(kù),可以提高IO功能開(kāi)發(fā)的效率
- org.apache.commons.io :有關(guān)Streams、Readers、Writes、Files的工具類
- org.apache.commons.io.input :輸入流相關(guān)的實(shí)現(xiàn)類,包含Reader和InputStream
- org.apache.commons.io.output :輸出流相關(guān)的實(shí)現(xiàn)類,包含Writer和OutputStream
- org.apache.commons.io.serialization :序列化相關(guān)的類
步驟:
- 下載Commons-io相關(guān)的jar包
- 復(fù)制到指定的Module的lib目錄中
- 加入到classpath中
public static void main(String args[]){
// 使用框架復(fù)制文件
IOUtils.copy(new FileInputStream("01_Demo/1.txt"), new FileOutputStream("01_Demo/2.txt"));
// 使用框架文件復(fù)制到文件夾
FileUtils.copyFileToDirectiry(new File("01_Demo/1.txt"), new File("D:/JavaTest"));
// 使用框架文件夾復(fù)制到文件夾
FileUtils.copyFileToDirectiry(new File("D:/zimo"), new File("D:/JavaTest"));
}
小結(jié):IOUtils和FileUtils可以方便的復(fù)制文件和文件夾
- JDK1.7開(kāi)始sun公司自己實(shí)現(xiàn)了copy技術(shù)
public static void main(String args[]){
File.copy(Paths.get("01_Demo/1.txt"), new FileOutputStream("01_Demo/2.txt"))
}
Base64
Base64是網(wǎng)絡(luò)上最常見(jiàn)的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64哥可打印字符來(lái)標(biāo)識(shí)二進(jìn)制數(shù)據(jù)的方法。
在Java 8中Base64編碼已經(jīng)成為Java類庫(kù)的標(biāo)準(zhǔn),Java 8 內(nèi)置了Base64 編碼的編碼器和解碼器
Base64工具類提供了一套靜態(tài)方法獲取下面三種Base64編解碼器:
- 基本:輸出被映射到一組字符A-Za-z0-9+/,編碼不添加任何行標(biāo),輸出的解碼僅支持A-Za-z0-9+/。
- URL:輸出映射到一組字符A-Za-z0-9+/,輸出是URL和文件
- MIME:輸出映射到MIME友好格式。輸出每行不超過(guò)76字符,并且使用'\r'并跟隨'\n'作為分割。編碼輸出最后沒(méi)有行分割
/**
* 目標(biāo):https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&
* wd=%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98&rsv_pq=adb2aafb0004cea1&rsv_t=bd4
*
* Base64可以實(shí)現(xiàn)編碼和解碼
* Java 8 內(nèi)置了Base64編碼的解碼器和編碼器
*
* encode:編碼。
* decode:解碼。
*/
public class Base64Demo{
public static void main(String args[]){
try{
// 1-1. 基本編碼后結(jié)果。普通文本
String rs = Base64.getEncoder().encodeToString("哈哈".getByte()); // 5ZOI5ZOI
// 1-2. 基本解碼后結(jié)果
byte[] decode = Base64.getDecoder().decode(rs);
System.out.println(new String(decode)); // 哈哈
// 2-1. URL編碼
String url = Base64.getUrlEncoder().encodeToString("?login=zimo&pass=12345".getBytes());
System.out.println(url); // P2xvZ2luPXppbW8mcGFzcz0xMjM0NQ==
// 2-2. URL解碼
byte[] url1 = Base64.getUrlDecoder().decode(url);
System.out.println(new String(url1)); // ?login=zimo&pass=12345
// 3-1. MIME編碼(大文件,郵箱等)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb.append(UUID.randomUUID().toString());
}
String mime = Base64.getMimeEncoder().encodeToString(sb.toString().getBytes());
System.out.println(mime); // M2FmMDM0ZmItM2QyMy00Y2YwLWEwMzEtMWUzNmI3ZDQ1OTgwNjAzMDk0ZjQtOTI0Yy00ZTM3LWI0
// NTMtZWQ5NWQzYTdiN2FkYzg2N2YyYzctOGY1NC00ZmFjLWI2MzctOTk1NDM3YzMxYTQyMTJlZDZk
// MTctYWJkMS00MTgxLWJmYjktNzg2NjM0YzkwZDIwZDMxMjcyNDItYjM2My00YjVjLWEwOGUtMzMz
// ODk3Y2M5NWViZWY3NWFmYjctZmUwZC00YjNlLTk1MWItNjMzOGYwZTI2NmVlMzAzN2MxMTYtZDA3
// OC00M2U0LWJkNGUtMTI2OWJkOGU1NmE1YWYyZmFhMWQtNDA0OS00MjI0LWI2MGItMGRkOTVkYjAz
// NDZjODc1ZmU1OWMtODY5My00NTE4LTkwNmItOGQ2YmM0NzNhZDE2YjJiMTAyNWUtZjc4MC00MTY3
// LWE3ZTEtNDNlMmFiNTFhNmQ0
// 3-2. MIME解碼
byte[] mime1 = Base64.getMimeDecoder().decode(mime);
System.out.println(new String(mime1));
// 252b9219-fdfa-4151-811a-884970a9295f
// 7e60291f-d03b-4f13-8839-9254f681a7d2
// c5c2fe56-6e89-4eb2-80a5-c95d4ab3899f
// ebb3651b-e3f4-4861-b9eb-0efedf00b413
// db6b06a4-e3d4-4e9a-a67b-6aecd7435613
// 5200e404-e0e8-4c8a-b297-55a8430c33ed
// c06da559-eb6b-41c8-9ff7-4d9a7f431ca4
// cda1d55b-6df3-4f61-8289-723b24c20795
// 10f59318-571e-4bd1-a45b-cb1cd9c34bcf
// cac21ea5-bf28-45e0-977b-cd18365363fc
}catch(Exception e){
}
}
}