1. 目标:给文件加密、解密(最基础版)
  2. 注意:
    a.加密过程:先读取整个目标文件,然后将目标文件写入一个新的文件中,在写入的过程中,每隔几个字符插入一个加密符号(随意定),此时这个新的文件就是加密文件
    b.解密过程:先读取整个加密文件,然后将加密文件写入一个新的文件中,在写入的过程中,每隔几个字符(与加密时一致)跳过加密符号,然后继续写入,继续跳过,最终,这个新的文件就是解密文件
    c.文本文件加解密可以使用字节流或字符流,图片、视频、音频等文件只能用字节流
  3. 代码
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("加密文件未找到!");
		}
	}
}