相信每个人都有小秘密吧,今天给大家分享一个小方法。使用流的方式对任意类型的文件进行加密。
首先,分析一下在计算机中是如何存储文件的。相信大多数人都有了解,计算机中存储文件的方式实际上是将文件中的二进制数据存储在磁盘或其他的存储设备中。
最基本的存储单位是位(bit),也是计算机中最小的信息单位,每一位只能表示0或1的二进制数据。在计算机中,8个位组成了一个字节(byte)。
而我们今天就是利用字节来对我们的文件进行加密。在Java中,“^”是按位异或运算符。它将两个数的二进制位进行比较,如果相同则结果为0,如果不同则结果为1。
比如:100^11=
100对应二进制为 0 1 1 0 0 1 0 0
11 对应的二进制为 0 0 0 0 1 0 1 1
---------------------------
0 1 1 0 1 1 1 1
在进行一次相同的操作 0 0 0 0 1 0 1 1
----------------------------
就变成了原来储存的字节了 0 1 1 0 0 1 0 0
1.true相当于是1,false相当于0。
public class Text {
public static void main(String[] args) {
System.out.println(true^true);
}
}
2.验证(100^11)^11=100
public class Text {
public static void main(String[] args) {
System.out.println(100^11);
System.out.println((100^11)^11);
}
}
3.进入正题,如何加密
加密的时候只能一个字节一个字节的进行读取,为了高效的进行这里使用了缓冲区,减少了从磁盘读取的时间。
import java.io.*;
public class encrypt {
public static void main(String[] args) throws IOException {
//要加密文件的路径(可以是绝对路径也可以是相对路径)
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("src/IO/d"));
//加密后的文件路径
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src/IO/e"));
int ch;
while((ch=bis.read())!=-1){
作用是将指定文件中的每一个字节与数字2进行按位异或运算,可以是任意数字
bos.write(ch^2);
}
//关流
bos.close();
bis.close();
}
}
4.解密
用相同的代码进行解密,需要将加密后的文件路径放入BufferedInputStream流中,
解密后的文件路径放入BufferedOutputStream流中。强调一下,无论是加密或者解密第二个文件路径的父级路径必须存在,否则会报"FileNotFoundError"类型的错误。