Java 8實現BASE64編解碼
Java一直缺少BASE64編碼 API,以至于通常在項目開發中會選用第三方的API實現。但是,Java 8實現了BASE64編解碼API,它包含到java.util包。下面我會對Java 8的BASE64 API做一個介紹。
java.util.Base64工具類提供了一套靜態方法獲取下面三種BASE64編解碼器:
1)Basic編碼
2)URL編碼
3)MIME編碼
Basic編碼是標準的BASE64編碼,用于處理常規的需求:輸出的內容不添加換行符,而且輸出的內容由字母加數字組成。下面是用法:
// 編碼 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
與早期處理BASE64編碼需求相比,不可能更簡單了。因為無需外部依賴:commons-codec或sun.misc.BASE64Decoder或JAXB的DatatypeConverter。
URL編碼也是我們經常會面對的需求,但由于URL對反斜線“/”有特殊的意義,因此URL編碼需要替換掉它,使用下劃線替換。比如下面的例子:
String basicEncoded = Base64.getEncoder().encodeToString("subjects?abcd".getBytes("utf-8")); System.out.println("Using Basic Alphabet: " + basicEncoded); String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8")); System.out.println("Using URL Alphabet: " + urlEncoded); // 輸出為: Using Basic Alphabet: c3ViamVjdHM/YWJjZA== Using URL Alphabet: c3ViamVjdHM_YWJjZA==
上面的例子可以看出,如果是使用基本的編碼器,那么輸出可能會包含反斜線“/”字符,但是如果使用URL編碼器,那么輸出的內容對URL來說是安全的。
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); // 輸出為: NDU5ZTFkNDEtMDVlNy00MDFiLTk3YjgtMWRlMmRkMWEzMzc5YTJkZmEzY2YtM2Y2My00Y2Q4LTk5 ZmYtMTU1NzY0MWM5Zjk4ODA5ZjVjOGUtOGMxNi00ZmVjLTgyZjctNmVjYTU5MTAxZWUyNjQ1MjJj NDMtYzA0MC00MjExLTk0NWMtYmFiZGRlNDk5OTZhMDMxZGE5ZTYtZWVhYS00OGFmLTlhMjgtMDM1 ZjAyY2QxNDUyOWZiMjI3NDctNmI3OC00YjgyLThiZGQtM2MyY2E3ZGNjYmIxOTQ1MDVkOGQtMzIz Yi00MDg0LWE0ZmItYzkwMGEzNDUxZTIwOTllZTJiYjctMWI3MS00YmQzLTgyYjUtZGRmYmYxNDA4 Mjg3YTMxZjMxZmMtYTdmYy00YzMyLTkyNzktZTc2ZDc5ZWU4N2M5ZDU1NmQ4NWYtMDkwOC00YjIy LWIwYWItMzJiYmZmM2M0OTBm
java.util.Base64 類封裝了所有的BASE64編碼器和解碼器,還支持流的封裝——這是一個非常優雅的構造——包括編碼和效率都很高(無需緩沖Buffer)——即編碼器和 解碼器的輸入和輸出無需緩沖Buffer。下面我們以一個例子來說明編碼器是怎樣封裝FileOutputStream,以及解碼器是怎樣封裝 FileInputStream的,兩者皆不需要緩沖Buffer:
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!