Java8 BASE64編解碼

Java8 BASE64編解碼java

Base64是一種用64個字符來表示任意二進制數據的方法。安全

Base64是一種最多見的二進制編碼方法。app

Java一直缺乏BASE64編碼 API,以致於一般在項目開發中會選用第三方的API實現。可是,Java 8實現了BASE64編解碼API,它包含到java.util包。java.util.Base64工具類提供了一套靜態方法獲取下面三種BASE64編解碼器:dom

1)Basic編碼ide

2)URL編碼工具

3)MIME編碼ui

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對反斜線「/」有特殊的意義,所以URL編碼須要替換掉它,使用下劃線替換。好比下面的例子:code

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:

public void wrapping() throws IOException {
  String src = "This is the content of any resource read from somewhere" +
    " into a stream. This can be text, image, video or any other stream.";

  // 編碼器封裝OutputStream, 文件/tmp/buff-base64.txt的內容是BASE64編碼的形式
  try (OutputStream os = Base64.getEncoder().wrap(newFileOutputStream("/tmp/buff-base64.txt"))) {
    os.write(src.getBytes("utf-8"));
  }

  // 解碼器封裝InputStream, 以及以流的方式解碼, 無需緩衝
  // is being consumed. There is no need to buffer the content of the file just for decoding it.
  try (InputStream is = Base64.getDecoder().wrap(newFileInputStream("/tmp/buff-base64.txt"))) {
    int len;
    byte[] bytes = new byte[100];
    while ((len = is.read(bytes)) != -1) {
      System.out.print(new String(bytes, 0, len, "utf-8"));
    }
  }
}

=====END=====

相關文章
相關標籤/搜索