最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8新特性之Base64詳解_動力節(jié)點(diǎn)Java學(xué)院整理

 更新時間:2017年06月07日 16:08:57   作者:benhaile  
這篇文章主要為大家詳細(xì)介紹了Java8新特性之Base64的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

BASE64 編碼是一種常用的字符編碼,在很多地方都會用到。但base64不是安全領(lǐng)域下的加密解密算法。能起到安全作用的效果很差,而且很容易破解,他核心作用應(yīng)該是傳輸數(shù)據(jù)的正確性,有些網(wǎng)關(guān)或系統(tǒng)只能使用ASCII字符。Base64就是用來將非ASCII字符的數(shù)據(jù)轉(zhuǎn)換成ASCII字符的一種方法,而且base64特別適合在http,mime協(xié)議下快速傳輸數(shù)據(jù)。

JDK里面實(shí)現(xiàn)Base64的API

在JDK1.6之前,JDK核心類一直沒有Base64的實(shí)現(xiàn)類,有人建議用Sun/Oracle JDK里面的sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder,使用它們的優(yōu)點(diǎn)就是不需要依賴第三方類庫,缺點(diǎn)就是可能在未來版本會被刪除(用maven編譯會發(fā)出警告),而且性能不佳,后面會有性能測試。

JDK1.6中添加了另一個Base64的實(shí)現(xiàn),javax.xml.bind.DatatypeConverter兩個靜態(tài)方法parseBase64Binary 和 printBase64Binary,隱藏在javax.xml.bind包下面,不被很多開發(fā)者知道。

在Java 8在java.util包下面實(shí)現(xiàn)了BASE64編解碼API,而且性能不俗,API也簡單易懂,下面展示下這個類的使用例子。

java.util.Base64

該類提供了一套靜態(tài)方法獲取下面三種BASE64編解碼器:

1)Basic編碼:是標(biāo)準(zhǔn)的BASE64編碼,用于處理常規(guī)的需求

// 編碼
String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64); // 輸出為: c29tZSBzdHJpbmc=
// 解碼
byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes, "utf-8")); // 輸出為: some string

2)URL編碼:使用下劃線替換URL里面的反斜線“/”

String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println("Using URL Alphabet: " + urlEncoded);
// 輸出為:
Using URL Alphabet: c3ViamVjdHM_YWJjZA==

3)MIME編碼:使用基本的字母數(shù)字產(chǎn)生BASE64輸出,而且對MIME格式友好:每一行輸出不超過76個字符,而且每行以“\r\n”符結(jié)束。

StringBuilder sb = new StringBuilder();
for (int t = 0; t < 10; ++t) {
 sb.append(UUID.randomUUID().toString());
}
byte[] toEncode = sb.toString().getBytes("utf-8");
String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode);
System.out.println(mimeEncoded);

第三方實(shí)現(xiàn)Base64的API

首先便是常用的Apache Commons Codec library里面的org.apache.commons.codec.binary.Base64;
第二個便是Google Guava庫里面的com.google.common.io.BaseEncoding.base64() 這個靜態(tài)方法;
第三個是net.iharder.Base64,這個jar包就一個類;
最后一個,號稱Base64編碼速度最快的MigBase64,而且是10年前的實(shí)現(xiàn),到現(xiàn)在是否能保持這個稱號,測一測便知道;

Base64編碼性能測試

上面講了一共7種實(shí)現(xiàn)Base64編碼,Jdk里面3種,第三方實(shí)現(xiàn)4種,一旦有選擇,則有必要將他們進(jìn)行一次高低對比,性能測試是最直接的方式

首先來定義兩個接口

private static interface Base64Codec
  {
    public String encode(final byte[] data);
    public byte[] decode(final String base64) throws IOException;
  }
  private static interface Base64ByteCodec
  {
    public byte[] encodeBytes(final byte[] data);
    public byte[] decodeBytes(final byte[] base64) throws IOException;
  }

兩個接口區(qū)別就是其中一個接口方法參數(shù)接收byte數(shù)組,返回byte數(shù)組,因?yàn)閎yte->byte相比String->byte或者byte->String性能上會快一點(diǎn),所以區(qū)分兩組來測試

private static final Base64Codec[] m_codecs = { new GuavaImpl(), new JavaXmlImpl(),
    new Java8Impl(), new SunImpl(), new ApacheImpl(),new MiGBase64Impl(),new IHarderImpl() };
private static final Base64ByteCodec[] m_byteCodecs = {
    new ApacheImpl(), new Java8Impl(),new MiGBase64Impl(),new IHarderImpl() };

從上面看出,其中支持byte->byte只有4中API;

7個Base64的實(shí)現(xiàn)類

private static class Java8Impl implements Base64Codec, Base64ByteCodec
  {
    private final Base64.Decoder m_decoder = Base64.getDecoder();
    private final Base64.Encoder m_encoder = Base64.getEncoder();
    @Override
    public String encode(byte[] data) {
      return m_encoder.encodeToString(data);
    }
    @Override
    public byte[] decode(String base64) throws IOException {
      return m_decoder.decode(base64);
    }
    public byte[] encodeBytes(byte[] data) {
      return m_encoder.encode( data );
    }
    public byte[] decodeBytes(byte[] base64) throws IOException {
      return m_decoder.decode( base64 );
    }
  }
  private static class JavaXmlImpl implements Base64Codec //no byte[] implementation
  {
    public String encode(byte[] data) {
      return DatatypeConverter.printBase64Binary( data );
    }
    public byte[] decode(String base64) throws IOException {
      return DatatypeConverter.parseBase64Binary( base64 );
    }
  }
..............

后面代碼基本就是各種API實(shí)現(xiàn)Base64的代碼了,就不詳細(xì)列出。

主要測試手段是,生成100M的隨機(jī)數(shù),分成100byte或者1000byte的塊,然后將他們分別編碼和解碼,記錄時間,如下方法

private static TestResult testByteCodec( final Base64ByteCodec codec, final List<byte[]> buffers ) throws IOException {
    final List<byte[]> encoded = new ArrayList<byte[]>( buffers.size() );
    final long start = System.currentTimeMillis();
    for ( final byte[] buf : buffers )
      encoded.add( codec.encodeBytes(buf) );
    final long encodeTime = System.currentTimeMillis() - start;
    final List<byte[]> result = new ArrayList<byte[]>( buffers.size() );
    final long start2 = System.currentTimeMillis();
    for ( final byte[] ar : encoded )
      result.add( codec.decodeBytes(ar) );
    final long decodeTime = System.currentTimeMillis() - start2;
    for ( int i = 0; i < buffers.size(); ++i )
    {
      if ( !Arrays.equals( buffers.get( i ), result.get( i ) ) )
        System.out.println( "Diff at pos = " + i );
    }
    return new TestResult( encodeTime / 1000.0, decodeTime / 1000.0 );
  }

測試結(jié)果

jvm參數(shù):-Xms512m -Xmx4G

一切都很明顯了,從上面看出,sun的表現(xiàn)不是很好,IHarder和MigBase64性能可以接受,傳說MigBase64性能第一,那也是過去了,在這次測試結(jié)果中,新的java8 base64運(yùn)行速度最好,javaXml表現(xiàn)次之。

總結(jié)

如果你需要一個性能好,可靠的Base64編解碼器,不要找JDK外面的了,java8里面的java.util.Base64以及java6中隱藏很深的javax.xml.bind.DatatypeConverter,他們兩個都是不錯的選擇。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring的RedisTemplate存儲的key和value有特殊字符的處理

    Spring的RedisTemplate存儲的key和value有特殊字符的處理

    這篇文章主要介紹了Spring的RedisTemplate存儲的key和value有特殊字符的處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Springboot?application.yml配置文件拆分方式

    Springboot?application.yml配置文件拆分方式

    這篇文章主要介紹了Springboot?application.yml配置文件拆分方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java的代理模式你真的了解嗎

    Java的代理模式你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了Java的代理模式,結(jié)構(gòu)型模式主要總結(jié)了一些類或?qū)ο蠼M合在一起的經(jīng)典結(jié)構(gòu),這些經(jīng)典的結(jié)構(gòu)可以解決特定應(yīng)用場景的問題,包括:代理模式、橋接模式、裝飾器模式、適配器模式、門面模式、組合模式、享元模式
    2022-03-03
  • 關(guān)于@EnableGlobalMethodSecurity注解的用法解讀

    關(guān)于@EnableGlobalMethodSecurity注解的用法解讀

    這篇文章主要介紹了關(guān)于@EnableGlobalMethodSecurity注解的用法解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java高級用法之注解和反射講義

    java高級用法之注解和反射講義

    這篇文章主要給大家介紹了關(guān)于java高級用法之注解和反射講義的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java內(nèi)存模型之重排序的相關(guān)知識總結(jié)

    Java內(nèi)存模型之重排序的相關(guān)知識總結(jié)

    重排序是指編譯器和處理器為了優(yōu)化性能而對指令序列進(jìn)行重新排序的一種手段,文中詳細(xì)介紹了Java重排序的相關(guān)知識,需要的朋友可以參考下
    2021-06-06
  • 淺談Spring Data Redis讀不到設(shè)進(jìn)去的值

    淺談Spring Data Redis讀不到設(shè)進(jìn)去的值

    本文主要介紹了Spring Data Redis怎么讀不到我剛才設(shè)進(jìn)去的值,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼

    Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼

    這篇文章主要介紹了Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳細(xì)分析Java內(nèi)部類——局部內(nèi)部類

    詳細(xì)分析Java內(nèi)部類——局部內(nèi)部類

    這篇文章主要介紹了Java局部內(nèi)部類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java 內(nèi)部類的知識,感興趣的朋友可以了解下
    2020-08-08
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(55)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(55)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08

最新評論

马龙县| 百色市| 江口县| 琼结县| 克东县| 自治县| 青川县| 西宁市| 衡水市| 海安县| 五华县| 克山县| 无棣县| 漾濞| 和顺县| 五家渠市| 安泽县| 通州市| 呼伦贝尔市| 永德县| 台湾省| 泸定县| 锦屏县| 四川省| 乾安县| 黔西县| 绩溪县| 湖口县| 邛崃市| 新民市| 墨脱县| 峨山| 南漳县| 双鸭山市| 黄大仙区| 天全县| 休宁县| 昌黎县| 威信县| 牡丹江市| 托克逊县|