本帖最后由 kelin410 于 2016-4-13 11:44 编辑
测试类中的代码:
- package com.heima.Demo;
- import java.io.File;
- import java.io.IOException;
- import com.heima.EncryptFile.EncryptFile;
- public class Demo1_Encrypt{
- public static void main(String[] args) throws IOException {
- //创建加密类,制定文件夹路径。并设置可以加密子文件夹中的文件,和制定后缀名的文件。
- EncryptFile ef = new EncryptFile(new File("E:\\黑马"), true, ".txt|.jpg");
- //为制定的文件夹中的文件加密。
- ef.encrypt();
- }
- }
复制代码
具体类中的代码:- package com.heima.EncryptFile;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.FilenameFilter;
- import java.io.IOException;
- /*
- * 需求:根据指定的文件夹路径或文件夹File对象将数据加密。
- * 注:可以设置是否加密子文件夹、可以通过文件过滤器加密某种类型的文件。
- *
- * 公共字段:
- * 无公共字段
- *
- * 构造方法:
- * 1.public EncryptFile(File aimFile)
- * 2.public EncryptFile(String path)
- * 3.public EncryptFile(File aimFile, boolean encryptSublevelFolder)
- * 4.public EncryptFile(File aimFile, String filter)
- * 5.public EncryptFile(File aimFile, boolean encryptSublevelFolder, String filter)
- * 构造方法参数说明:
- * 1.aimFile 一个有效的文件夹对象
- * 2.path 一个有效的文件夹路径
- * 3.encryptSublevelFolder 是否要对子文件夹中的文件进行加密
- * 4.filter 过滤器条件,如过给出了条件就表示启用文件过滤器。可以设置多个后缀名,中间用“|”分开。例如:".jpg|.bmp|.txt"
- *
- * 公共方法:
- * 1.public void encrypt () 执行加密
- * 2.public File getAimFolder() 过去当前对象中封装的文件夹路径
- * 3.public boolean setAimFolder(String aimFolderString) 重新设置当前对象中封装的文件夹路径
- * 4.public boolean setAimFolder(File aimFolder) 重新设置当前对象中封装的文件夹路径
- *
- */
- public class EncryptFile {
- private boolean useFilter = false; //是否使用文件过滤器
- private boolean encryptSublevelFolder = false; //是否加密子文件夹
- private String[] filter; //当用户传入多个过滤器条件时,此数组用来存放每个条件。
- private File aimFolder; //创建File对象用来存放用户给定的文件路径。
-
- /**
- * 有参构造,用户必须在创建本类对象时给定一个有效的文件夹对象
- * @param aimFile
- * @throws FileNotFoundException
- */
- public EncryptFile(File aimFile) throws FileNotFoundException {
- super();
- this.aimFolder = aimFile;
- if (!this.aimFolder.isDirectory() || !this.aimFolder.exists()) //如果用户给定的不是一个有效文件夹路径,就抛出异常。
- throw new FileNotFoundException(aimFile.getAbsolutePath());
- }
- /**
- * 有参构造,用户必须在创建本类对象时给定一个有效的文件夹路径
- * @param path
- * @throws FileNotFoundException
- */
- public EncryptFile(String path) throws FileNotFoundException {
- this(new File(path));
- }
-
- /**
- * 有参构造,用户可以设置是否加密子文件夹
- * @param aimFile
- * @param encryptDirectory
- * @throws FileNotFoundException
- */
- public EncryptFile(File aimFile, boolean encryptSublevelFolder) throws FileNotFoundException {
- this(aimFile);
- this.encryptSublevelFolder = encryptSublevelFolder;
- }
-
- /**
- * 有参构造,用户可以设置是否加密子文件夹和是否使用过滤器
- * @param aimFile
- * @param filter
- * @throws FileNotFoundException
- */
- public EncryptFile(File aimFile, String filter) throws FileNotFoundException {
- this(aimFile);
- if (!filter.matches("\\.[a-z]{2,}"))
- new FileNotFoundException("没有找到合法的过滤器格式");
-
- this.filter = filter.split("\\|");
- if (this.filter.length == 0)
- new FileNotFoundException("没有找到合法的过滤器格式");
- this.useFilter = true;
- }
-
- /**
- * 有参构造,用户可以设置是否即加密子文件夹,又使用过滤器
- * @param aimFile
- * @param encryptDirectory
- * @param filter
- * @throws FileNotFoundException
- */
- public EncryptFile(File aimFile, boolean encryptSublevelFolder, String filter) throws FileNotFoundException {
- this(aimFile, filter);
- this.encryptSublevelFolder = encryptSublevelFolder;
- }
-
- /**
- * 获取当前EncryptFile对象中封装的File对象
- * @return
- */
- public File getAimFolder() {
- return aimFolder;
- }
- /**
- * 改变当前EncryptFile对象中所封装的文件夹对象
- * @param aimFolder
- */
- public boolean setAimFolder(File aimFolder) {
- return folderValidity(aimFolder);
- }
-
- /**
- * 改变当前EncryptFile对象中所封装的文件夹对象,成功返回true,失败返回false.
- * @param aimFolderString
- * @return
- */
- public boolean setAimFolder(String aimFolderString) {
- return folderValidity(new File(aimFolderString));
- }
- //此方法是检验一个文件夹是否符合要求,如果符合要求就赋值给成员属性aimFolder
- private boolean folderValidity(File newAimFile) {
- if (!newAimFile.isDirectory() || !newAimFile.exists()) //如果用户给定的不是一个有效文件夹路径,返回false
- return false;
- this.aimFolder = newAimFile;
- return true;
- }
-
- /**
- * 加密文件,将EncryptFile对象中封装的路径中所有的符合指定过滤器的文件进行加密。
- */
- public void encrypt () {
- analyse (aimFolder);
- }
- //分析文件
- private void analyse (File aimFolder) {
- //定义File数组,存放给定文件夹中的所有符合过滤器的对象。
- File[] fiArr = aimFolder.listFiles(new FilenameFilter() {
-
- //重写过滤器中的抽象方法
- @Override
- public boolean accept (File dir, String name) {
- File fi = new File(dir, name);
- if (useFilter == false && encryptSublevelFolder == true) //如果不启用过滤器,且要对子文件夹加密,如果是直接返回true。
- return true;
-
- if (useFilter == true && encryptSublevelFolder == true) //如果既要启用过滤器又要加密子文件夹就判断是否满足过滤器,不满足就返回是否是文件夹
- return isFilter(name) ? true : fi.isDirectory();
-
- if (useFilter == true && encryptSublevelFolder == false) //如果只使用过滤器不加密子文件夹,就返回是否不是文件夹,如果不是就返回是否满足过滤器。
- return fi.isDirectory() ? false : isFilter(name);
-
- return fi.isFile(); //如果不满足前面三条,就直接返回是否是文件。因为是文件就肯定不是文件夹。
- }
-
-
- //判断指定的文件名是否包含在过滤器中
- private boolean isFilter(String name) {
- for (String s : filter) {
- if (name.endsWith(s))
- return true;
- }
- return false;
- }
-
- });
- File tempFile = new File("temp"); //定义临时文件,用来将要加密的文件先剪切的当前目录,然后再加密写出到原目录。
- for (File f : fiArr) { //遍历获取到的每个文件对象。
- if (f.isDirectory()) //如果当前对象是文件夹,就递归调用本方法。
- analyse(f);
- else { //如果不是文件夹就进行加密操作。
- f.renameTo(tempFile);
- startEncrypt(tempFile, f);
- }
- }
- }
- //开始加密文件,tempFile是一个临时文件 ,加密后将会删除。srcFile是源文件。
- private void startEncrypt (File tempFile, File srcFile) {
- System.out.println(Thread.currentThread().getName() + " : " + tempFile + " 到 " + srcFile);
- synchronized (this) {
- BufferedInputStream bufi = null;
- BufferedOutputStream bufo = null;
- try {
- bufi = new BufferedInputStream(new FileInputStream(tempFile)); //创建高效字节输入流
- bufo = new BufferedOutputStream(new FileOutputStream(srcFile)); //创建高效字节输出流
- byte[] by = new byte[8192]; //创建字节数组,用于接收bufi读取到的数据。
- int len;
- while ((len = bufi.read(by)) != -1) {
- for (int x = 0; x < len; x++) //遍历读取到的数据,将他们加密。
- by[x] = (byte) (by[x] ^ 13);
-
- bufo.write(by, 0, len); //加密完成后,一次性写入到原文件的原目录中。
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- //关闭流
- try {
- if (bufi != null)
- bufi.close();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- if (bufo != null)
- bufo.close();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- //删除临时文件
- tempFile.delete();
- }
- }
- }
- }
- }
- }
复制代码
|
|