XML

XML

Extensible Market Language 可擴(kuò)展標(biāo)記語(yǔ)言

  1. XML是特殊文件形式,結(jié)構(gòu)化文件
  2. 做數(shù)據(jù)保存
  3. 做信息交互和共享的(重點(diǎn),數(shù)據(jù)傳輸)
  4. 做系統(tǒng)的配置文件數(shù)據(jù)

XML作用

  1. 數(shù)據(jù)交換:不同的計(jì)算機(jī)語(yǔ)言之間,不同的操作系統(tǒng)之間,不同的數(shù)據(jù)庫(kù)之間,進(jìn)行數(shù)據(jù)交換
01_XML數(shù)據(jù)交換.png
  1. 配置文件:在后期我們主要用于各種框架的配置文件

    <?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)成:

  1. 聲明(抬頭):必須在第一行

    version:指定XML文件使用的版本,取值是1.0

    encoding:當(dāng)前xml使用的編碼(字符集)

    standalone:指定當(dāng)前這個(gè)XML文件是否是一個(gè)獨(dú)立的文件,省略的,默認(rèn)是獨(dú)立文件

  2. 元素(標(biāo)簽)

    語(yǔ)法:<a>開(kāi)頭 內(nèi)容 </a>結(jié)尾

    主體部分:標(biāo)簽分為有主體和沒(méi)有主體的兩種,如果沒(méi)有主題,標(biāo)簽一定要結(jié)束

    大小寫:區(qū)分大小寫

    命名:不能由空格,不能有冒號(hào)

    根元素:有且只有一個(gè)根元素

  3. 屬性

    例如:<person id = "10086">

  4. 注釋

  5. 實(shí)體字符

02_實(shí)體字符.png
  1. CDATA字符數(shù)據(jù)區(qū)

  2. 處理指令

<?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 &gt; 18 &amp;&amp; age &lt; 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é):

    1. 聲明有哪兩個(gè)常用屬性?

      version、encoding

    2. 一個(gè)XML有幾個(gè)根元素?

      一個(gè)

    3. XML標(biāo)簽命名不能有什么符號(hào)?

      空格、冒號(hào)

  • 一個(gè)良好的XML有以下特點(diǎn)

    1. 必須以XML聲明開(kāi)頭
    2. 必須擁有唯一的根元素
    3. 開(kāi)始標(biāo)簽必須與結(jié)束標(biāo)簽相匹配
    4. 元素對(duì)大小寫敏感
    5. 所有的元素必須關(guān)閉
    6. 所有的元素必須正確地嵌套
    7. 特殊字符必須使用實(shí)體字符或使用字符數(shù)據(jù)區(qū)

XML約束:

XML文件的標(biāo)簽和屬性可以隨意擴(kuò)展,有時(shí)我們必須要限制每個(gè)文檔有哪些元素,每個(gè)元素都有哪些子元素,每個(gè)元素有哪些屬性等,從而保證XML文檔格式和數(shù)據(jù)的正確性和規(guī)范性

DTD約束

  1. DTD:Document Type Definiation 文檔類型定義
  2. 作用:純文本文件,指定了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的不足:
    1. 不能驗(yàn)證數(shù)據(jù)類型
    2. 因?yàn)镈TD是一個(gè)文本文件,本身不能驗(yàn)證是否正確

Schema特點(diǎn)

  1. 約束文件本身也是一個(gè)XML文件,它本身也會(huì)被其它xsd文檔約束
  2. 內(nèi)置多種數(shù)據(jù)類型,可以檢查數(shù)據(jù)類型是否正確
  3. 支持命名空間,一個(gè)XML文件可以同時(shí)引入多個(gè)xsd的約束文件,讓約束規(guī)則重用
  4. 擴(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的解析方式

  1. 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)存溢出
  2. SAX解析:
    • 事件驅(qū)動(dòng)型解析方式,讀取一行就解析一行,釋放內(nèi)存??梢越馕鋈我獯笮〉腦ML文件
    • 缺點(diǎn):使用過(guò)不能再次訪問(wèn),不能修改,只能查詢

Java中的DOM解析開(kāi)發(fā)包

  1. JAXP:Oracle官方提供API,同時(shí)支持DOM和SAX
  2. JDOM:開(kāi)源項(xiàng)目,基于樹(shù)形結(jié)構(gòu),利用純Java的技術(shù)對(duì)XML文檔實(shí)現(xiàn)解析、生成、序列化及多種操作
  3. \color{red}{Dom4j}:是JDOM升級(jí)版,性能優(yōu)異,功能強(qiáng)大,使用簡(jiǎn)單,性能超過(guò)sun公司的dom技術(shù),Habrenate也是用它讀寫配置
  4. 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安裝步驟

  1. 下載dom4j框架,jar包
  2. 把dom4j核心jar包導(dǎo)入項(xiàng)目
  3. 項(xiàng)目中創(chuàng)建文件夾:lib
  4. 將dom4j.jar復(fù)制到lib中
  5. 在jar文件夾上右鍵,Add As Library
  6. 類中導(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使用步驟

    1. 導(dǎo)入dom4j框架(XPath依賴dom4j技術(shù))
    2. 導(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ù)的寫法

    1. 絕對(duì)路徑:/根元素/子元素/子元素

    2. 相對(duì)路徑:./子元素/子元素(.代表了當(dāng)前元素)

    3. 全文搜索:

      //元素 在全文查找這個(gè)元素

      //元素1/元素2 在全文招元素1下面一級(jí)元素2

      //元素1//元素2 在全文找元素1下面的全部元素2

    4. 屬性查找:

      //@屬性名稱 在全文檢索屬性對(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配置文件

03_sqlMapConfig.png
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)建

工廠模式的作用

  1. 對(duì)象通過(guò)工廠的方法創(chuàng)建返回,工廠的方法可以為該對(duì)象進(jìn)行加工和數(shù)據(jù)注入
  2. 可以實(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)原則為:

  1. 定義父類
  2. 定義原始類,繼承父類,定義功能
  3. 定義裝飾類,繼承父類,包裝原始類,增強(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)的類

步驟:

  1. 下載Commons-io相關(guān)的jar包
  2. 復(fù)制到指定的Module的lib目錄中
  3. 加入到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){
            
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • day22_XML_XML約束 思維導(dǎo)圖 復(fù)習(xí) 今日內(nèi)容 XML XML約束 XML的學(xué)習(xí) XML概念 XML的介...
    蹦蹦跶跶的起床啊閱讀 673評(píng)論 0 0
  • 1:xml的概述 1.1 xml是什么 標(biāo)記語(yǔ)言:語(yǔ)言中出現(xiàn)了 的標(biāo)簽 a:HTML 超文本標(biāo)記語(yǔ)言 (語(yǔ)法非...
    小小一技術(shù)驛站閱讀 466評(píng)論 0 0
  • xml經(jīng)典總結(jié) XML(eXtensible Markup Language)是萬(wàn)維網(wǎng)聯(lián)盟(World Wide ...
    91數(shù)據(jù)閱讀 1,068評(píng)論 0 2
  • XML; 是什么? Extensible Markup Languare 可擴(kuò)展標(biāo)記型語(yǔ)言 為什么要有XML? 1...
    _Levi__閱讀 1,428評(píng)論 1 0
  • XML/web/servlet 一 XML 1. 標(biāo)記語(yǔ)言 標(biāo)記語(yǔ)言,是一種將文本(Text)以及文本相關(guān)的其他信...
    小山居閱讀 817評(píng)論 0 0

友情鏈接更多精彩內(nèi)容