激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 詳細(xì)分析JAVA8新特性 Base64

詳細(xì)分析JAVA8新特性 Base64

2020-08-03 14:36沃德天拉莫帥 Java教程

這篇文章主要介紹了JAVA8新特性 Base64的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

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

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

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

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

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

java.util.Base64

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

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

?
1
2
3
4
5
6
// 編碼
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里面的反斜線“/”

?
1
2
3
4
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輸出,而且對(duì)MIME格式友好:每一行輸出不超過(guò)76個(gè)字符,而且每行以“\r\n”符結(jié)束。

?
1
2
3
4
5
6
7
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;

第二個(gè)便是Google Guava庫(kù)里面的com.google.common.io.BaseEncoding.base64() 這個(gè)靜態(tài)方法;

第三個(gè)是net.iharder.Base64,這個(gè)jar包就一個(gè)類(lèi);

最后一個(gè),號(hào)稱(chēng)Base64編碼速度最快的MigBase64,而且是10年前的實(shí)現(xiàn),到現(xiàn)在是否能保持這個(gè)稱(chēng)號(hào),測(cè)一測(cè)便知道;

Base64編碼性能測(cè)試

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

首先來(lái)定義兩個(gè)接口

?
1
2
3
4
5
6
7
8
9
10
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;
 }

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

?
1
2
3
4
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個(gè)Base64的實(shí)現(xiàn)類(lèi)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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ì)列出。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 );
 }

測(cè)試結(jié)果

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

詳細(xì)分析JAVA8新特性 Base64

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

總結(jié)

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

以上就是詳細(xì)分析JAVA8新特性 Base64的詳細(xì)內(nèi)容,更多關(guān)于JAVA8 Base64的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://my.oschina.net/benhaile/blog/267738

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产超碰人人做人人爱 | 手机免费看一级片 | 伦理三区 | 福利一区二区三区视频在线观看 | 免费黄色在线电影 | 久久国产经典 | 午夜精品老牛av一区二区三区 | 午夜a狂野欧美一区二区 | 亚洲码无人客一区二区三区 | 欧美一级高清片在线 | 亚洲国产精品久久久久婷婷老年 | 天天撸日日夜夜 | 一级α片免费看 | 久久精品影视 | 免费在线观看国产精品 | av日韩一区二区三区 | 极品美女一级毛片 | 国产91在线亚洲 | 视频一区二区三区在线播放 | 天天鲁在线视频免费观看 | 男男啪羞羞视频网站 | 草免费视频 | 曰韩在线视频 | 色视频在线播放 | 5xsq在线视频| 成人一级黄色片 | 精品国产专区 | 国产成人77亚洲精品www | 亚洲国产精品久久久久婷婷老年 | 国产精品久久久久免费视频 | 欧美日韩一 | 热re91久久精品国产99热 | www.狠狠插.com | 在线看免费观看av | 一级毛片免费版 | 亚洲一区二区三区高清视频 | 日本在线免费观看视频 | 日韩黄色av网站 | 国产精品久久久久久模特 | 精品久久久久久久久久久久久久 | 一区二区美女视频 |