黑马程序员技术交流社区
标题:
自己试着写了一个类,贴出来,望大家帮我指正指正。
[打印本页]
作者:
kelin410
时间:
2016-4-13 11:36
标题:
自己试着写了一个类,贴出来,望大家帮我指正指正。
本帖最后由 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();
}
}
}
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2