需求:以 GBK 編碼讀取檔案二進位流 → 封裝進 XML → 網路傳輸 → 接收端按 GBK 寫回檔案。開發者嘗試將位元組轉字串再處理,導致資料損壞無法還原。
Base64.getEncoder().encodeToString(bytes) → 存入 XML 文字節點。Base64.getDecoder().decode(str) → 還原位元組陣列 → 直接寫入檔案(完全二進位寫入,無需指定編碼)。// 發送端
byte[] data = Files.readAllBytes(Paths.get("source.dat"));
String base64 = Base64.getEncoder().encodeToString(data);
// 將 base64 寫入 XML ...
// 接收端
byte[] restored = Base64.getDecoder().decode(base64FromXml);
Files.write(Paths.get("target.dat"), restored); // 完全還原,位元組級相同
檔案本身是位元組序列,沒有「編碼」屬性。Base64 還原後的位元組與原檔逐位元組相同,直接寫入即可。只有當原檔為純文字檔且需轉碼(如 GBK → UTF-8)時,才需解碼/編碼處理。
new String(bytes, "GBK") 解碼,再按目標編碼寫入。