亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳細分析JAVA8新特性 Base64

 更新時間:2020年08月03日 09:40:56   作者:沃德天拉莫帥  
這篇文章主要介紹了JAVA8新特性 Base64的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

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

JDK里面實現Base64的API

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

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

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

java.util.Base64

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

1)Basic編碼:是標準的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編碼:使用基本的字母數字產生BASE64輸出,而且對MIME格式友好:每一行輸出不超過76個字符,而且每行以“\r\n”符結束。

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);

第三方實現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年前的實現,到現在是否能保持這個稱號,測一測便知道;

Base64編碼性能測試

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

首先來定義兩個接口

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ū)別就是其中一個接口方法參數接收byte數組,返回byte數組,因為byte->byte相比String->byte或者byte->String性能上會快一點,所以區(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的實現類

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實現Base64的代碼了,就不詳細列出。

主要測試手段是,生成100M的隨機數,分成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 );
 }

測試結果

jvm參數:-Xms512m -Xmx4G

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

總結

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

以上就是詳細分析JAVA8新特性 Base64的詳細內容,更多關于JAVA8 Base64的資料請關注腳本之家其它相關文章!

相關文章

  • Java查看和修改線程優(yōu)先級操作詳解

    Java查看和修改線程優(yōu)先級操作詳解

    JAVA中每個線程都有優(yōu)化級屬性,默認情況下,新建的線程和創(chuàng)建該線程的線程優(yōu)先級是一樣的。本文將為大家詳解Java查看和修改線程優(yōu)先級操作的方法,需要的可以參考一下
    2022-08-08
  • JavaSE實現電影院系統(tǒng)

    JavaSE實現電影院系統(tǒng)

    這篇文章主要為大家詳細介紹了JavaSE實現電影院系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Spring攔截器HandlerInterceptor接口代碼解析

    Spring攔截器HandlerInterceptor接口代碼解析

    這篇文章主要介紹了Spring攔截器HandlerInterceptor接口代碼解析,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • 基于SpringBoot實現圖片上傳及圖片回顯

    基于SpringBoot實現圖片上傳及圖片回顯

    本篇文章主要介紹了SpringBoot如何實現圖片上傳及圖片回顯,文中通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-08-08
  • SpringBoot啟動遇到的異常問題及解決方案

    SpringBoot啟動遇到的異常問題及解決方案

    這篇文章主要介紹了SpringBoot啟動遇到的異常問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java 字符串反轉實現代碼

    Java 字符串反轉實現代碼

    這篇文章主要介紹了 Java 字符串反轉實現代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • SpringBoot使用PageHelper分頁詳解

    SpringBoot使用PageHelper分頁詳解

    這篇文章主要介紹了SpringBoot使用PageHelper分頁詳解,我們在任何的系統(tǒng)中,分頁功能是必不可少的,然而,對于這個功能如果有一種快速開發(fā)的實現方式,當然可以節(jié)省我們很多的時間了,接下來,我就給大家基于不同的環(huán)境來說說如何使用一個分頁插件,需要的朋友可以參考下
    2023-10-10
  • 使用SSM+Layui+Bootstrap實現汽車維保系統(tǒng)的示例代碼

    使用SSM+Layui+Bootstrap實現汽車維保系統(tǒng)的示例代碼

    本文主要實現對汽車維修廠的信息化管理功能,。實現的主要功能包含用戶管理、配置管理、汽車管理、故障管理、供應商管理、配件管理、維修訂單管理、統(tǒng)計信息、公告管理、個人信息管理,感興趣的可以了解一下
    2021-12-12
  • 一文讀懂Spring Bean的生命周期

    一文讀懂Spring Bean的生命周期

    今天我們來說一說 Spring Bean 的生命周期,小伙伴們應該在面試中經常遇到,這是正?,F象,本文讓更多的小伙伴們可以輕松的讀懂 Spring Bean 的生命周期
    2023-03-03
  • 詳解Java中l(wèi)ist,set,map的遍歷與增強for循環(huán)

    詳解Java中l(wèi)ist,set,map的遍歷與增強for循環(huán)

    這篇文章主要介紹了詳解Java中l(wèi)ist,set,map的遍歷與增強for循環(huán)的相關資料,需要的朋友可以參考下
    2017-02-02

最新評論