A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

算法很简单,主要是想让大家帮我指正一下,有没有哪里写的不好的地方。或者需要改进的地方。写的不好不要笑我哟!!!!
  1. package com.heima.EncryptFile;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.FilenameFilter;
  9. import java.io.IOException;

  10. /*
  11. * 需求:根据指定的文件夹路径或文件夹File对象将数据加密。
  12. *                 注:可以设置是否加密子文件夹、可以通过文件过滤器加密某种类型的文件。
  13. *
  14. * 公共字段:
  15. *                         无公共字段
  16. *
  17. * 构造方法:
  18. *                         1.public EncryptFile(File aimFile)
  19. *                         2.public EncryptFile(String path)
  20. *                         3.public EncryptFile(File aimFile, boolean encryptSublevelFolder)
  21. *                         4.public EncryptFile(File aimFile, String filter)
  22. *                         5.public EncryptFile(File aimFile, boolean encryptSublevelFolder, String filter)
  23. *                 构造方法参数说明:
  24. *                                 1.aimFile 一个有效的文件夹对象
  25. *                                 2.path        一个有效的文件夹路径
  26. *                                 3.encryptSublevelFolder        是否要对子文件夹中的文件进行加密
  27. *                                 4.filter        过滤器条件,如过给出了条件就表示启用文件过滤器。可以设置多个后缀名,中间用“|”分开。例如:".jpg|.bmp|.txt"
  28. *
  29. * 公共方法:
  30. *                         1.public void encrypt ()  执行加密
  31. *                         2.public File getAimFolder()        过去当前对象中封装的文件夹路径
  32. *                         3.public boolean setAimFolder(String aimFolderString)        重新设置当前对象中封装的文件夹路径
  33. *                         4.public boolean setAimFolder(File aimFolder)                        重新设置当前对象中封装的文件夹路径
  34. *
  35. */
  36. public class EncryptFile {
  37.         private boolean useFilter = false;                                        //是否使用文件过滤器
  38.         private boolean encryptSublevelFolder = false;                //是否加密子文件夹
  39.         private String[] filter;                                                                //当用户传入多个过滤器条件时,此数组用来存放每个条件。
  40.         private File aimFolder;                                                                //创建File对象用来存放用户给定的文件路径。
  41.        
  42.         /**
  43.          * 有参构造,用户必须在创建本类对象时给定一个有效的文件夹对象       
  44.          * @param aimFile
  45.          * @throws FileNotFoundException
  46.          */
  47.         public EncryptFile(File aimFile) throws FileNotFoundException {
  48.                 super();
  49.                 this.aimFolder = aimFile;
  50.                 if (!this.aimFolder.isDirectory() || !this.aimFolder.exists())                        //如果用户给定的不是一个有效文件夹路径,就抛出异常。
  51.                         throw new FileNotFoundException(aimFile.getAbsolutePath());
  52.         }

  53.         /**
  54.          * 有参构造,用户必须在创建本类对象时给定一个有效的文件夹路径
  55.          * @param path
  56.          * @throws FileNotFoundException
  57.          */
  58.         public EncryptFile(String path) throws FileNotFoundException {
  59.                 this(new File(path));
  60.         }
  61.        
  62.         /**
  63.          * 有参构造,用户可以设置是否加密子文件夹
  64.          * @param aimFile
  65.          * @param encryptDirectory
  66.          * @throws FileNotFoundException
  67.          */
  68.         public EncryptFile(File aimFile, boolean encryptSublevelFolder) throws FileNotFoundException {
  69.                 this(aimFile);
  70.                 this.encryptSublevelFolder = encryptSublevelFolder;
  71.         }
  72.        
  73.         /**
  74.          * 有参构造,用户可以设置是否加密子文件夹和是否使用过滤器
  75.          * @param aimFile
  76.          * @param filter
  77.          * @throws FileNotFoundException
  78.          */
  79.         public EncryptFile(File aimFile, String filter) throws FileNotFoundException {
  80.                 this(aimFile);
  81.                 if (!filter.matches("\\.[a-z]{2,}"))
  82.                         new FileNotFoundException("没有找到合法的过滤器格式");
  83.                
  84.                 this.filter = filter.split("\\|");
  85.                 if (this.filter.length == 0)
  86.                         new FileNotFoundException("没有找到合法的过滤器格式");
  87.                 this.useFilter = true;
  88.         }
  89.        
  90.         /**
  91.          * 有参构造,用户可以设置是否即加密子文件夹,又使用过滤器
  92.          * @param aimFile
  93.          * @param encryptDirectory
  94.          * @param filter
  95.          * @throws FileNotFoundException
  96.          */
  97.         public EncryptFile(File aimFile, boolean encryptSublevelFolder, String filter) throws FileNotFoundException {
  98.                 this(aimFile, filter);
  99.                 this.encryptSublevelFolder = encryptSublevelFolder;
  100.         }

  101.         /**
  102.          * 加密文件,将EncryptFile对象中封装的路径中所有的符合指定过滤器的文件进行加密。
  103.          */
  104.         public void encrypt () {
  105.                 analyse (aimFolder);
  106.         }
  107.        
  108.         /**
  109.          * 获取当前EncryptFile对象中封装的File对象
  110.          * @return
  111.          */
  112.         public File getAimFolder() {
  113.                 return aimFolder;
  114.         }

  115.         /**
  116.          * 改变当前EncryptFile对象中所封装的文件夹对象
  117.          * @param aimFolder
  118.          */
  119.         public boolean setAimFolder(File aimFolder) {
  120.                 return folderValidity(aimFolder);
  121.         }
  122.        
  123.         /**
  124.          * 改变当前EncryptFile对象中所封装的文件夹对象,成功返回true,失败返回false.
  125.          * @param aimFolderString
  126.          * @return
  127.          */
  128.         public boolean setAimFolder(String aimFolderString) {
  129.                 return folderValidity(new File("aimFolderString"));
  130.         }

  131.         //此方法是检验一个文件夹是否符合要求,如果符合要求就赋值给成员属性aimFolder
  132.         private boolean folderValidity(File newAimFile) {
  133.                 if (!newAimFile.isDirectory() || !newAimFile.exists())                        //如果用户给定的不是一个有效文件夹路径,返回false
  134.                         return false;
  135.                 this.aimFolder = newAimFile;
  136.                 return true;
  137.         }

  138.         //分析文件
  139.         private void analyse (File aimFolder) {
  140.                 //定义File数组,存放给定文件夹中的所有符合过滤器的对象。
  141.                 File[] fiArr = aimFolder.listFiles(new FilenameFilter() {
  142.                        
  143.                         //重写过滤器中的抽象方法
  144.                         @Override
  145.                         public boolean accept (File dir, String name) {
  146.                                 File fi = new File(dir, name);
  147.                                 if (useFilter == false && encryptSublevelFolder == true)                                //如果不启用过滤器,且要对子文件夹加密,如果是直接返回true。
  148.                                         return true;
  149.                                
  150.                                 if (useFilter == true && encryptSublevelFolder == true)                                //如果既要启用过滤器又要加密子文件夹就判断是否满足过滤器,不满足就返回是否是文件夹
  151.                                         return isFilter(name) ? true : fi.isDirectory();
  152.                                        
  153.                                 if (useFilter == true && encryptSublevelFolder == false)                                //如果只使用过滤器不加密子文件夹,就返回是否不是文件夹,如果不是就返回是否满足过滤器。
  154.                                         return fi.isDirectory() ? false : isFilter(name);
  155.                                
  156.                                 return fi.isFile();                                                                                                //如果不满足前面三条,就直接返回是否是文件。因为是文件就肯定不是文件夹。
  157.                         }
  158.                        
  159.                        
  160.                         //判断指定的文件名是否包含在过滤器中
  161.                         private boolean isFilter(String name) {
  162.                                 for (String s : filter) {
  163.                                         if (name.endsWith(s))
  164.                                                 return true;
  165.                                 }
  166.                                 return false;
  167.                         }
  168.                        
  169.                 });       
  170.                 File tempFile = new File("temp");                                                                                                                //定义临时文件,用来将要加密的文件先剪切的当前目录,然后再加密写出到原目录。
  171.                 for (File f : fiArr) {                                                                                                                                        //遍历获取到的每个文件对象。
  172.                         if (f.isDirectory())                                                                                                                                //如果当前对象是文件夹,就递归调用本方法。
  173.                                 analyse(f);
  174.                         else {                                                                                                                                                                //如果不是文件夹就进行加密操作。
  175.                                 f.renameTo(tempFile);
  176.                                 startEncrypt(tempFile, f);
  177.                         }
  178.                 }
  179.         }

  180.         //开始加密文件,tempFile是一个临时文件,加密后将会删除。srcFile是源文件。
  181.         private void startEncrypt(File tempFile, File srcFile) {
  182.                 BufferedInputStream bufi = null;
  183.                 BufferedOutputStream bufo = null;
  184.                 try {
  185.                         bufi = new BufferedInputStream(new FileInputStream(tempFile));                                                //创建高效字节输入流
  186.                         bufo = new BufferedOutputStream(new FileOutputStream(srcFile));                                                        //创建高效字节输出流
  187.                         byte[] by = new byte[8192];                                                                                                                //创建字节数组,用于接收bufi读取到的数据。
  188.                         int len;                                                                                       
  189.                         while ((len = bufi.read(by)) != -1) {
  190.                                 for (int x = 0; x < len; x++)                                                                                                        //遍历读取到的数据,将他们加密。
  191.                                         by[x] = (byte) (by[x] ^ 13);
  192.                                
  193.                                 bufo.write(by, 0, len);                                                                                                                        //加密完成后,一次性写入到原文件的原目录中。
  194.                         }
  195.                 } catch (IOException e) {
  196.                         System.out.println(srcFile);
  197.                 } finally {
  198.                         //关闭流
  199.                                 try {
  200.                                         if (bufi != null)
  201.                                         bufi.close();
  202.                                 } catch (IOException e) {
  203.                                         e.printStackTrace();
  204.                                 } finally {
  205.                                                 try {
  206.                                                         if (bufo != null)
  207.                                                                 bufo.close();
  208.                                                 } catch (IOException e) {
  209.                                                         e.printStackTrace();
  210.                                                 } finally {
  211.                                                         //删除临时文件
  212.                                                         tempFile.delete();
  213.                                                 }
  214.                                 }
  215.                 }
  216.         }
  217. }
复制代码


1 个回复

倒序浏览
如果觉的注释写的不全或者我表达的不够清楚的话,请给我留言哦。
第一次写这么长的代码,还希望大家给与鼓励哟。谢谢了先!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马