色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

詳細分析JAVA8新特性 Base64

瀏覽:70日期:2022-08-27 15:34:55

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里面實現(xiàn)Base64的API

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

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

在Java 8在java.util包下面實現(xiàn)了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編碼:使用基本的字母數(shù)字產(chǎn)生BASE64輸出,而且對MIME格式友好:每一行輸出不超過76個字符,而且每行以“rn”符結(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);

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

Base64編碼性能測試

上面講了一共7種實現(xiàn)Base64編碼,Jdk里面3種,第三方實現(xiàn)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ū)別就是其中一個接口方法參數(shù)接收byte數(shù)組,返回byte數(shù)組,因為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的實現(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實現(xiàn)Base64的代碼了,就不詳細列出。

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

詳細分析JAVA8新特性 Base64

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

總結(jié)

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

以上就是詳細分析JAVA8新特性 Base64的詳細內(nèi)容,更多關(guān)于JAVA8 Base64的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日韩精品免费视频 | 美国毛片一级视频在线aa | 久久精品国产精品亚洲精品 | 国产成人精品免费午夜 | 天天躁天天碰天天看 | 欧美综合视频 | 91人成亚洲高清在线观看 | 免费人成在观看 | 91在线产啪| 农村寡妇偷毛片一级 | 国产亚洲精品国产一区 | 韩国福利一区 | 国产日韩精品视频一区二区三区 | 欧美在线做爰高清视频 | 9191精品国产观看 | 亚洲天堂男人天堂 | 欧美一线不卡在线播放 | 欧亚毛片| 久久精品国产亚洲7777 | 一区二区三区精品国产欧美 | 99ri在线精品视频在线播放 | 欧美三级视频在线观看 | 亚洲图片视频在线观看 | 欧美日韩亚洲成色二本道三区 | 欧美成年人视频 | 亚洲国产爱久久全部精品 | 国产欧美在线不卡 | 毛片大全免费 | 国产在线欧美精品 | 国产欧美日本亚洲精品五区 | 成年人在线看片 | 精品在线视频免费观看 | 久草在线网站 | 狠狠88综合久久久久综合网 | 日本道久久| 精品视频一区二区三区 | 亚洲精品一区二区三区在线播放 | 在线播放成人毛片免费视 | 美国一级毛片片免费 | 黑人边吃奶边扎下面激情视频 | 国产成人mv 在线播放 |