原博主地址:(https://blog.csdn.net/LoveLion/article/details/17517213)
外观者模式,就是把简单任务拆分,各司其职,所以就没有写例子。
外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
不过通过这事,我把我之前写的加密进行整改,不是真的外观者模式。
加密类
package test2019.mon01.外观者模式;
import java.io.File;
import java.io.IOException;
/**
* Filename: Mi.java
* Description:
* @author: guzhangyan
* @date: 2019年1月28日 下午2:13:06
*/
public class Mi {
public void JiaMi(String url1, String url2) throws IOException {
File file1 = new File(url1);
File file2 = new File(url2);
file2.mkdirs();
MiMi mimi = new MiMi();
for (File file : file1.listFiles()) {
if (file.isFile()) {
new MiCopy().copyFile(file, url2+ File.separator , mimi,"jia");
}
if (file.isDirectory()) {
// 复制目录
String sourceDir = url1 + File.separator + file.getName();
new MiCopy().copyDirectiory(sourceDir, url2 + File.separator,file.getName(),mimi,"jia");
}
}
}
public void JieMi(String url1, String url2) throws IOException {
File file1 = new File(url1);
File file2 = new File(url2);
file2.mkdirs();
MiMi mimi = new MiMi();
for (File file : file1.listFiles()) {
if (file.isFile()) {
new MiCopy().copyFile(file, url2+ File.separator , mimi,"jie");
}
if (file.isDirectory()) {
// 复制目录
String sourceDir = url1 + File.separator + file.getName();
new MiCopy().copyDirectiory(sourceDir, url2 + File.separator,file.getName(),mimi,"jie");
}
}
}
}
文件复制类
package test2019.mon01.外观者模式;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*
* @author: guzhangyan
* @date: 2019年1月28日 下午2:30:30
*/
public class MiCopy {
public void copyFile(File file, String url, MiMi mimi,String key) throws IOException {
String fileName = file.getName();
if("jia".equals(key)) {
fileName = mimi.jiaMi(fileName);
}else if("jie".equals(key)) {
fileName = mimi.jieMi(fileName);
}
File targetFile = new File(url + fileName);
BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null;
try {
// 新建文件输入流并对它进行缓冲
inBuff = new BufferedInputStream(new FileInputStream(file));
// 新建文件输出流并对它进行缓冲
outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));
// 缓冲数组
byte[] b = new byte[1024 * 5];
int len;
while ((len = inBuff.read(b)) != -1) {
if("jia".equals(key)) {
b = mimi.jiaMi(b);
}else if("jie".equals(key)) {
b = mimi.jieMi(b);
}
outBuff.write(b, 0, len);
}
// 刷新此缓冲的输出流
outBuff.flush();
} finally {
// 关闭流
if (inBuff != null)
inBuff.close();
if (outBuff != null)
outBuff.close();
}
}
public void copyDirectiory(String sourceDir, String targetDir, String fileName, MiMi mimi,String key) throws IOException {
if("jia".equals(key)) {
fileName = mimi.jiaMi(fileName);
}else if("jie".equals(key)) {
fileName = mimi.jieMi(fileName);
}
targetDir = targetDir + fileName;
// 新建目标目录
(new File(targetDir)).mkdirs();
// 获取源文件夹当前下的文件或目录
File[] file = (new File(sourceDir)).listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isFile()) {
// 源文件
File sourceFile = file[i];
// 目标文件
this.copyFile(sourceFile, new File(targetDir).getAbsolutePath() + File.separator, mimi,key);
}
if (file[i].isDirectory()) {
// 准备复制的源文件夹
String dir1 = sourceDir + "/" + file[i].getName();
copyDirectiory(dir1, targetDir + "/", file[i].getName(), mimi,key);
}
}
}
}
加密实现类
package test2019.mon01.外观者模式;
/**
*
* @author: guzhangyan
* @date: 2018年11月20日 下午1:53:17
*/
public class MiMi {
private int mimi = 0;
private int key = 7;
private int id = 0;
public String jiaMi(String fileName) {
id++;
char[] names = fileName.toCharArray();
String name = "";
//mimi = id;
System.out.println("jia: "+mimi);
mimi = getMimi(mimi, key);
for (char c : names) {
char c2 = getCharJia(c, mimi);
name += c2;
mimi = getMimi(mimi, c);
System.out.print(mimi+" ");
}
System.out.println();
return toSix(id) + name;
}
private String toSix(int id2) {
String str = id2 + "";
while (str.length() < 6) {
str = "0" + str;
}
return str;
}
public String jieMi(String fileName) {
//mimi = Integer.parseInt(fileName.substring(0,6));
fileName = fileName.substring(6);
char[] names = fileName.toCharArray();
String name = "";
System.out.println("jie: "+mimi);
mimi = getMimi(mimi, key);
for (char c : names) {
char c2 = getCharJie(c, mimi);
name += c2;
mimi = getMimi(mimi, c2);
System.out.print(mimi+" ");
}
System.out.println();
return name;
}
private char getCharJia(char c, int mimi2) {
if (64 < c && c < 91) {
return (char) (((c + mimi2) % 65 % 26) + 65);
}
if (96 < c && c < 123) {
return (char) (((c + mimi2) % 97 % 26) + 97);
}
return c;
}
private char getCharJie(char c, int mimi2) {
int mimi22 = 26 - mimi2;
if (64 < c && c < 91) {
return (char) (((c + mimi22) % 65 % 26) + 65);
}
if (96 < c && c < 123) {
return (char) (((c + mimi22) % 97 % 26) + 97);
}
return c;
}
private int getMimi(int mimi2, int key2) {
return (mimi2 + key2) % 26;
}
/**
* @param b
* @return
* @author: guzhangyan
* @version:2018年11月20日 下午3:39:14 方法说明
*/
public byte[] jiaMi(byte[] b) {
byte[] b2 = new byte[b.length];
mimi = getByteMimi(mimi, key);
for (int i = 0; i < b.length; i++) {
b2[i] = jiaMiByte(mimi, b[i]);
mimi = getByteMimi(mimi, b[i]);
}
return b2;
}
public byte[] jieMi(byte[] b) {
byte[] b2 = new byte[b.length];
mimi = getByteMimi(mimi, key);
for (int i = 0; i < b.length; i++) {
b2[i] = jieMiByte(mimi, b[i]);
mimi = getByteMimi(mimi, b2[i]);
}
return b2;
}
private byte jiaMiByte(int mimi2, byte b) {
return (byte) ((mimi2 + b + 128) % 256 - 128);
}
private byte jieMiByte(int mimi2, byte b) {
int mimi22 = 256 - mimi2;
return (byte) ((mimi22 + b + 128) % 256 - 128);
}
private int getByteMimi(int mimi2, int key2) {
return (mimi2 + key2) % 256;
}
}
测试类
package test2019.mon01.外观者模式;
import java.io.IOException;
/**
*
* @author: guzhangyan
* @date: 2019年1月28日 下午2:10:33
*/
public class Test {
public static void main(String[] args) throws IOException {
// 源文件夹
String url1 = "E:\\downloads\\zhixin\\hxc";
// 目标文件夹
String url2 = "E:\\downloads\\zhixin\\hxc-copy";
new Mi().JiaMi(url1,url2);
String url3 = "E:\\downloads\\zhixin\\hxc-copy2";
new Mi().JieMi(url2,url3);
}
}
现在该方法有个问题,就是解密后的文件名首字母会错,思考不出来,如有大神发现问题所在,欢迎评论。