Java文本加解密可用字符流实现凯撒位移法,核心是统一UTF-8编码、按规则变换ASCII值(如字母循环移位±3),用InputStreamReader/OutputStreamWriter替代FileReader/FileWriter避免乱码,逐行处理并保持换行符不加密。

Java 中可用字符流对文本做简易加密解密,核心思路是:读取字符时按规则变换(如 ASCII 值加减偏移量),写入时反向操作。关键在于统一编码、避免乱码,且不依赖第三方库。
用 FileReader / FileWriter 配合位移加密(如凯撒)
这是最轻量的方式,适合小文件或简单场景。以每个字符 ASCII 值 +3 为加密,-3 为解密(注意处理字母边界,如 'z'→'c'):
- 加密时:读取 char,若为小写字母,用
(c - 'a' + 3) % 26 + 'a'循环移位;大写字母同理;数字/符号可保持不变或单独规则 - 解密时:把 +3 换成 -3,并加 26 再取模,保证结果非负,例如
(c - 'a' - 3 + 26) % 26 + 'a' - 务必指定编码(如 UTF-8),否则 FileReader 默认使用平台编码,跨系统易出错;建议改用
InputStreamReader(new FileInputStream(...), "UTF-8")
用 BufferedReader / BufferedWriter 提升效率与可读性
逐行处理更符合文本习惯,也便于跳过空行或注释行:
- 加密时:
readLine()读整行,遍历每个 char 加密,拼接新字符串后write()输出 - 解密同理,但需确保加解密逻辑完全对称;特别注意换行符本身不参与加密(否则不同系统换行符 \n/\r\n 可能被误改)
- BufferedWriter 要调用
newLine()写换行,不要直接 write("\n"),兼容性更好
用 InputStreamReader / OutputStreamWriter 统一编码控制
真正规避乱码问题的推荐方式——绕过 FileReader/FileWriter 的编码不确定性:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 加密示例:
try (InputStreamReader reader = new InputStreamReader(new FileInputStream("in.txt"), "UTF-8"); OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("out.txt"), "UTF-8")) { int ch; while ((ch = reader.read()) != -1) { writer.write(encryptChar((char) ch)); // 自定义加密方法 } } - 解密只需把
encryptChar换成decryptChar,逻辑一一对应 - 所有字符(包括中文)都会按 UTF-8 编码正确流转,不会因平台默认编码差异导致解密失败
注意事项与简化建议
简易加密不追求安全强度,但要保证可靠还原:
- 避免修改不可见字符(如 '\t'、'\b'),除非业务明确需要;重点处理字母、数字、常用标点即可
- 密钥尽量用常量或配置传入,不要硬编码在算法里;比如偏移量 3 可改为参数
int key - 如果只是临时混淆(如配置文件防手误查看),位移法足够;若需稍强一点,可叠加异或(
c ^ key),它自逆,加解密用同一操作 - 别用 DataInputStream/DataOutputStream 处理纯文本——它们面向字节且含类型标记,和字符流语义冲突
不复杂但容易忽略编码一致性,抓住“字符流 = 编码感知”这个本质,就能稳稳跑通加解密流程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










