目录
前言
有了IO流的输入输出之后,不仅可以对文件进行赋值操作,也可以和异或操作结合就可以实现对文件进行加密和解密。
一、复制
1.复制操作
对文件进行复制,对文件先进行读入操作,然后再写出至另一个文件内,
代码如下:
public class Test1 {
public static void main(String[] args) throws IOException {
//创建字节输入流,关联文件a.jpg,复制的就是此文件
FileInputStream fis=new FileInputStream("demo/a.jpg");
//创建字节输出流,关联文件b.jpg,复制完成后文件名为b.jpg.
FileOutputStream fos=new FileOutputStream("b.jpg");
int by;
//循环读取文件字节,并直接写入复制的文件中.
while ((by=fis.read())!=-1){
fos.write(by);
}
//关闭输入流和输出流
fis.close();
fos.close();
}
}
复制了一个1.55M的文件 ,时间用了8秒多,可见效率时比较慢的。因此可以使用数组存入的方式对文件进行读取和写入操作。
2.优化代码
创建数组时,一般会以1024的倍数出现,一般情况就是会创建一个长度为1024*8长度的数组,代码如下:
public class Test1 {
public static void main(String[] args) throws IOException {
//创建字节输入流,关联文件a.jpg,复制的就是此文件
FileInputStream fis = new FileInputStream("demo/a.png");
//创建字节输出流,关联文件b.jpg,复制完成后文件名为b.jpg.
FileOutputStream fos = new FileOutputStream("demo/b.png");
//创建一个长度为1024*8的byte类ing数组,用来存储读入的字节
byte[] arr = new byte[1024 * 8];
//返回fis.read(arr)返回值为写入数组的有效长度
int len;
//循环读取文件字节,并直接写入复制的文件中.
while ((len = fis.read(arr)) != -1) {
//将输入的值进行写入,write中一次为写入是那个数组的值,从0号索引开始,写入len长度
fos.write(arr,0,len);
}
fis.close();
fos.close();
}
}
这样仅仅使用了16毫秒,速度提升了很多。
二、异或
异或操作的符号为:^.
操作为将数字转换为二进制,进行异或操作时,相同为0,不同为1;
例如:
一个数对0进行异或操作结果就是其本身,对本身异或操作的结果为0。
三、对文件加密
1.加密原理
由于文件在底层都是以二进制进行存储的,因此使用字节输入流及字节输出流就可以对文件进行简单的加密操作。
2.进行加密
与复制类似秩序要将代码写入时将字节码与你的密码进行异或操作即可
public class Test2 {
public static void main(String[] args) throws IOException {
//加密的密码,后续解码也许要此密码
int password=12134;
//创建字节输入流,关联文件a.jpg,复制的就是此文件
FileInputStream fis = new FileInputStream("demo/a.png");
//创建字节输出流,关联文件b.jpg,复制完成后文件名为b.jpg.
FileOutputStream fos = new FileOutputStream("demo/b.png");
int by;
//循环读取文件字节,并直接写入复制的文件中.
while ((by = fis.read()) != -1) {
fos.write(by^password);
}
fis.close();
fos.close();
}
}
3.优化代码
此方法也是存在速度慢的情况,因此,也可以用数组的方式进行加密,代码如下:
public class Test2 {
public static void main(String[] args) throws IOException {
int password=12312;
//创建字节输入流,关联文件a.jpg,复制的就是此文件
FileInputStream fis = new FileInputStream("demo/a.png");
//创建字节输出流,关联文件b.jpg,复制完成后文件名为b.jpg.
FileOutputStream fos = new FileOutputStream("demo/b.png");
byte[] arr = new byte[1024 * 8];
int len;
//循环读取文件字节,并直接写入复制的文件中.
while ((len = fis.read(arr)) != -1) {
//因为要将每个字节都与密码进行异或操作,for循环遍历即可
for (int i = 0; i < len; i++) {
arr[i]^=password;
}
fos.write(arr,0,len);
}
fis.close();
fos.close();
}
}
此方法即可对文件进行简单的加密操作。
因为异或有异或本身为0的特性,则解码时,对加密的文件再次异或密码即可实现解码。
总结
本文对文件复制及加密解密进行了简单的操作。