可通过继承filteroutputstream并重写write()方法实现加密:它包装底层流,所有写操作经加密后再转发;以xor为例,构造时传入密钥,重写write方法对字节异或加密后调用super.write()。

可以通过继承 FilterOutputStream 并重写 write() 方法,在数据写入底层流之前完成加密处理。
理解 FilterOutputStream 的作用机制
FilterOutputStream 是一个装饰器类,它包装一个已有的 OutputStream,所有写操作都会经过它再转发到底层流。它的核心是维护一个 out 字段(即被包装的流),并提供默认的 write(int)、write(byte[]) 和 write(byte[], int, int) 实现——这些方法最终都调用 out.write(...)。要实现加密,关键是在转发前对字节进行变换。
编写自定义加密输出流的基本步骤
以简单的异或(XOR)加密为例(实际项目中应使用标准加密算法如 AES):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 继承
FilterOutputStream,在构造时传入目标流和密钥(如 byte 类型的密钥) - 重写三个
write方法:对输入字节/字节数组做加密运算,再调用super.write(...)写入底层流 - 注意:单字节
write(int b)只取低 8 位,需确保密钥参与运算时逻辑一致 - 可选:重写
flush()(若加密不涉及缓冲则无需);一般不重写close(),由父类统一处理
一个简易 XOR 加密输出流示例
以下是一个可直接运行的参考实现:
<font size="2"><pre class="brush:php;toolbar:false;">public class XorOutputStream extends FilterOutputStream {
private final byte key;
public XorOutputStream(OutputStream out, byte key) {
super(out);
this.key = key;
}
@Override
public void write(int b) throws IOException {
out.write(b ^ key);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
byte[] encrypted = new byte[len];
for (int i = 0; i
使用时:
try (XorOutputStream cos = new XorOutputStream(new FileOutputStream("data.enc"), (byte) 0x55)) {<br>
cos.write("Hello".getBytes());<br>}
生成的文件内容即为原文每个字节与
0x55 异或后的结果。
注意事项与进阶建议
实际加密场景需更严谨:
- 简单 XOR 不安全,生产环境应使用
CipherOutputStream(基于 JCE 的标准加解密流) - 若加密算法需要状态(如 AES 的 IV 或块模式),应在流中保存并管理该状态,避免多线程干扰
- 务必保证加解密两端使用完全相同的算法、密钥、IV 和填充方式,否则无法还原
- 不要在流中硬编码密钥;应通过参数传入,并确保密钥安全存储与传递
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










