場景
-
有時候我們需要在
XML
文件裏保存一個縮略圖,但是XML
不支持不可見字符的保存,如何做? -
當我們需要在
URL
裏POST
或PUT
一些不可見字符或特殊符號,比如+
號,如何做?
說明
-
Base64
是網絡上最常見的用於傳輸8Bit
字節碼的編碼方式之一,Base64
就是一種基於64
個可打印字符來表示二進制數據的方法。可查看RFC2045~RFC2049
,上面有MIME
的詳細規範. -
對於以上的問題可以通過
Base64
把縮略圖內容直接轉碼爲可見的字符就能存儲在XML
文檔裏. -
對於特殊字符作爲的
URL
或者HTTP
頭或者密碼,也可以通過Base64
轉碼之後再提交. -
在
JDK8
之前,Java SE
並沒有提供公共的Base64
方法,只有未文檔化的sun.misc.BASE64Encoder
.現在JDK8
在包java.util.Base64
裏提供了工廠方法實現.
例子
- 文件TestBase64.java
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;
/**
* TestBase64
*/
public class TestBase64 {
public static void PRINT(String str) {
System.out.println(str);
}
private static void testBase64(){
// base64編碼
PRINT("====================== testBase64 =======================");
PRINT("====================== encoder =======================");
Base64.Encoder encoder = Base64.getEncoder();
String normalString = "https://infoworld.blog.csdn.net++";
String encodedString = encoder.encodeToString(
normalString.getBytes(StandardCharsets.UTF_8));
PRINT(encodedString);
// base64解碼
PRINT("=================== decoder ==========================");
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedByteArray = decoder.decode(encodedString);
String buf = new String(decodedByteArray);
PRINT(buf);
// 編碼文件
PRINT("====================== mimeEncoder =======================");
Path originalPath = Paths.get("1.txt");
Path targetPath = Paths.get("1-base64.txt");
Base64.Encoder mimeEncoder = Base64.getMimeEncoder();
try (OutputStream output = Files.newOutputStream(targetPath)) {
Files.copy(originalPath, mimeEncoder.wrap(output));
}catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
testBase64();
}
}
- 1-base64.txt
aHR0cHM6Oi8vaW5mb3dvcmxkLmJsb2cuY3Nkbi5u
- 輸出:
====================== testBase64 =======================
====================== encoder =======================
aHR0cHM6Ly9pbmZvd29ybGQuYmxvZy5jc2RuLm5ldCsr
=================== decoder ==========================
https://infoworld.blog.csdn.net++
====================== mimeEncoder =======================