Base64解码后文本首行出现中文乱码问题排查求助
解决Base64解码后第一行开头乱码的问题
嘿,我之前做类似的文本转Base64工具时也踩过编码的坑,咱们来看看你的代码问题出在哪~
核心问题分析
你当前代码里的字符流与字节流混用是导致乱码的主要原因:
Files.readAllBytes是直接读取文件的原始字节,这一步没问题;- 但你用
PrintWriter来写入内容,PrintWriter是字符流,默认会用系统编码把字符串转成字节写入。Base64编码后的字符串在这个转换过程中,很可能因为编码不匹配导致字节被篡改,后续解码时自然就出现乱码了。 - 另外,
writer.print("")这种清空文件的方式也不够可靠,它并没有真正截断文件内容,可能残留旧数据的字节。
修复后的代码示例
咱们把字符流换成字节流来处理,保证编码全程一致:
加密方法(文本转Base64)
public void encrypt() { try { // 读取原始文件字节 byte[] fileText = Files.readAllBytes(appFile.toPath()); // 进行Base64编码 Base64.Encoder encoder = Base64.getEncoder(); byte[] encodedBytes = encoder.encode(fileText); // 直接写入字节,覆盖原有文件 Files.write(appFile.toPath(), encodedBytes, StandardOpenOption.TRUNCATE_EXISTING); } catch (IOException e) { e.printStackTrace(); } }
解密方法(Base64转文本)
public void decrypt() { try { // 读取Base64编码后的字节 byte[] encodedBytes = Files.readAllBytes(appFile.toPath()); // 进行Base64解码 Base64.Decoder decoder = Base64.getDecoder(); byte[] decodedBytes = decoder.decode(encodedBytes); // 写入解码后的原始字节,保证和原文件完全一致 Files.write(appFile.toPath(), decodedBytes, StandardOpenOption.TRUNCATE_EXISTING); } catch (IOException e) { e.printStackTrace(); } }
额外注意事项
如果你的原始文本文件是用特定编码(比如UTF-8)保存的,解码后写入时不需要额外指定编码——因为decodedBytes就是原文件的原始字节,直接写入就能完美还原内容。
内容的提问来源于stack exchange,提问作者K.Milli
相关产品推荐
相关产品推荐

