加密解密原理:基于对同一值异或两次变成原值
a^=b; 等价于 a=a^b;
磁盘批量读写效率高
byte[] buff = new byte[8192];// 8192 8k是最佳值
一批一批地读写,减少磁盘寻址此次数
数组不能太大,太大占用内存
经过测试,8192效率高,占用内存少,再往上加,对效率提升不明显
getFilePointer注意用法
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;
public class TestJiaMi {
/**
* 如
* 10110100
* ^
* 11000110
* =
* 01110010
*
* ^
* 11000110
* 10110100
*
* 文件加密解密 用一个字节值,对每个字节值求异或 解密:随便找一个值求异或
*/
public static void main(String[] args) {
System.out.println("输入文件名:");
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
File f = new File(s);
if (!f.isFile()) {
System.out.println("不是文件");
sc.close();
System.exit(0);
}
System.out.println("key");
int key = sc.nextInt();
sc.close();
try {
entrypt2(f, key);
System.out.println("完成");
} catch (IOException e) {
System.out.println("失败");
e.printStackTrace();
}
}
public static void entrypt(File file, int key) throws IOException {
/**
* 从文件读取一个字节值,对key异或后再写回到文件
*/
RandomAccessFile raf = new RandomAccessFile(file, "rw");
// 单字节读取标准格式
int b;
while ((b = raf.read()) != -1) {
b ^= key;
raf.seek(raf.getFilePointer() - 1);
raf.write(b);
}
raf.close();
}
//批量加密
public static void entrypt2(File file, int key) throws IOException {
/**
* 从文件读取一个字节值,对key异或后再写回到文件
*/
RandomAccessFile raf = new RandomAccessFile(file, "rw");
byte[] buff = new byte[8192];// 8192 8k是最佳值
int n;// 保存每一批的数量,每一批有n个
while ((n = raf.read(buff)) != -1) {
// 对数组前n个字节值加密
for (int i = 0; i < n; i++) {
buff[i] ^= key;
}
// 下标前移n个位置
raf.seek(raf.getFilePointer() - n);
// 数组中前n个字节,一批写回文件
raf.write(buff, 0, n);
}
raf.close();
}
}
运行结果:
输入文件名:
bg.jpg
key
250
完成
文件被加密
运行结果:
输入文件名:
bg.jpg
key
250
完成
文件被解密