- 目标:给文件加密、解密(最基础版)
- 注意:
a.加密过程:先读取整个目标文件,然后将目标文件写入一个新的文件中,在写入的过程中,每隔几个字符插入一个加密符号(随意定),此时这个新的文件就是加密文件
b.解密过程:先读取整个加密文件,然后将加密文件写入一个新的文件中,在写入的过程中,每隔几个字符(与加密时一致)跳过加密符号,然后继续写入,继续跳过,最终,这个新的文件就是解密文件
c.文本文件加解密可以使用字节流或字符流,图片、视频、音频等文件只能用字节流 - 代码
package May.Tenth.IO_Buffered;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 给文件加密和解密
*
* @author Jia
*
*/
public class EncryptionAndDecipherFile {
String sign = "###";
public static void main(String[] args) {
new EncryptionAndDecipherFile().encryptionFile("E:/Javatest/3.txt", "E:/Javatest/1");
new EncryptionAndDecipherFile().decipher("E:/Javatest/1/加密版3.txt", "E:/Javatest/1");
System.out.println("over");
}
// 加密方法
public void encryptionFile(String path1, String path2) {
// 添加目标文件的对象
File file = new File(path1);
// 为加密文件设置存储路径
path2 = path2 + "/" + "加密版" + file.getName();
// 判断目标对象是否存在
if (file.exists()) {
// 声明缓冲字符输入流
BufferedReader br = null;
// 声明缓冲字符输出流
BufferedWriter bw = null;
try {
// 创建缓冲字符输入流
br = new BufferedReader(new FileReader(file));
// 创建缓冲字符输出流
bw = new BufferedWriter(new FileWriter(path2));
// 循环读取数据
String str = null;
while ((str = br.readLine()) != null) {
int i = 0;
int b = 2;
// 循环给目标文件添加加密符号
while (i < str.length() || i == str.length()) {
// 判断i+b 是否会大于str的长度,若是,则改变b的大小,保证不会溢出
if ((i + b) > str.length()) {
b = str.length() - i;
}
// 写入部分数据
bw.write(str, i, b);
// 添加加密符号
bw.write(sign);
// 改变i的大小,2表示每隔2个字符添加一个加密符号
i = i + 2;
// 强制刷新
bw.flush();
}
// 换行
bw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭输入输出流
bw.close();
br.close();
System.out.println("文件加密成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
System.out.println("目标文件不存在!");
}
}
// 解密方法
public void decipher(String path1, String path2) {
// 创建已加密文件的对象
File file = new File(path1);
// 为解密文件创建路径
path2 = path2 + "/" + "解密版" + file.getName().replaceAll("加密版", "");
// 判断文件是否存在
if (file.exists()) {
// 声明缓冲字符输入流
BufferedReader br = null;
// 声明缓冲字符输出流
BufferedWriter bw = null;
try {
// 创建缓冲字符输入流
br = new BufferedReader(new FileReader(file));
// 创建缓冲字符输出流
bw = new BufferedWriter(new FileWriter(path2));
// 循环读取加密文件
String str = null;
// 循环给加密文件去掉加密符号
while ((str = br.readLine()) != null) {
// 判断每行最后是否有加密字符将加密符号删掉
if (str.endsWith(sign)) {
str = str.substring(0, str.length() - sign.length());
}
// 循环写入
int i = 0;
int b = 2;
while (i < str.length() || i == str.length()) {
// 判断i+b是否大于str的长度,若大于,应改变b的大小,使调用write方法输出时,不会大于str长度
if ((i + b) > str.length()) {
b = str.length() - i;
}
// 将数据写出
bw.write(str, i, b);
// 改变i的大小,使下次写出时能够跳过加密字符
i = i + 2 + sign.length();
// 强制刷新
bw.flush();
}
// 换行
bw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭输入输出流
bw.close();
br.close();
System.out.println("文件解密成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
System.out.println("加密文件未找到!");
}
}
}