```java
/**
* 递归压缩方法
* @author ouxd
* @param bytes 这个参数为map<string,object>,object可以为map和byte[]两种类型,可以循环创建,string为文件名,包含文件后缀,可以传空,则会少一层文件夹
* @param name 调用的时候传空字符串,如果不为空,则会多一层文件目录
*
* */
public static void compressByByteArr(Object bytes, ZipOutputStream zos, String name) throws Exception {
ByteArrayInputStream bais = null;
int temp = 0;
if (bytes instanceof byte[]) {
byte[] buf = new byte[2*1024];
byte[] fileBytes = (byte[]) bytes;
bais = new ByteArrayInputStream(fileBytes);
//3.2设置ZipEntry对象,并对需要压缩的文件命名
zos.putNextEntry(new ZipEntry(name));
//3.3读取要压缩的字节输出流,进行压缩
while ((temp = bais.read(buf)) != -1) {
// zos.write(temp); // 压缩输出
zos.write(buf, 0, temp);
}
zos.closeEntry();
} else {
//如果为map的话,则递归调用
Map object1 = (Map) bytes;
Set keySet = object1.keySet();
for (Object o : keySet) {
String localName =null;
if ("".equals(name)) {
localName= o.toString();
}else {
localName=name+"/"+o.toString();
}
compressByByteArr(object1.get(o), zos, localName);
}
}
}
```java
```java
public static void main(String[] args) throws Exception {
/** 测试压缩方法 简单的测试 */
Map<String, Object> byteMap = new HashMap<>();
// 第1步、使用File类找到一个文件
File f = new File("F:\\template\\001\\test1.txt"); // 声明File对象
InputStream input = null; // 准备好一个输入的对象
input = new FileInputStream(f); // 通过对象多态性,进行实例化
// 第3步、进行读操作
byte result[] = new byte[Integer.valueOf(f.length() + "")]; // 所有的内容都读到此数组之中
input.read(result); // 读取内容 网络编程中 read 方法会阻塞
// 第4步、关闭输出流
input.close(); // 关闭输出流
File f2 = new File("F:\\template\\001\\test2.txt"); // 声明File对象
// 第2步、通过子类实例化父类对象
input = new FileInputStream(f2); // 通过对象多态性,进行实例化
// 第3步、进行读操作
byte result2[] = new byte[Integer.valueOf(f2.length() + "")]; // 所有的内容都读到此数组之中
input.read(result2); // 读取内容
// 第4步、关闭输出流
input.close(); // 关闭输出流
File f4 = new File("F:\\template\\test.xlsx"); // 声明File对象
// 第2步、通过子类实例化父类对象
input = new FileInputStream(f4); // 通过对象多态性,进行实例化
// 第3步、进行读操作
byte result4[] = new byte[Integer.valueOf(f4.length() + "")]; // 所有的内容都读到此数组之中
input.read(result4); // 读取内容
// 第4步、关闭输出流
input.close(); // 关闭输出流
Map fileAndDic = new HashMap();
//加入文件
fileAndDic.put("test1.txt", result);
fileAndDic.put("text2.txt", result2);
//这个文件放在文件夹下
Map fileMap = new HashMap();
fileMap.put("test.xlsx", result4);
//加入文件夹
fileAndDic.put("文件夹", fileMap);
//map的结构就是文件夹的结构,如果有后缀的则是文件,没有后缀的为生成文件夹
//
byteMap.put("001", fileAndDic);
//1.创建字节数组输出流,用于返回压缩后的输出流字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//2.创建压缩输出流
ZipOutputStream zipOut = new ZipOutputStream(baos);
long startTime = System.currentTimeMillis();
ZipUtils.compressByByteArr(byteMap, zipOut, "");
zipOut.close();
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
File file = new File("F:\\template" + "\\" + "测试多文件目录压缩.zip");
byte[] toByteArray = baos.toByteArray();
OutputStream os = new FileOutputStream(file);
os.write(toByteArray);
os.close();
baos.close();
/** 测试压缩方法2 */
}
![最上级目录](https://img-blog.csdnimg.cn/20200304105542611.png)
![在001文件夹下](https://img-blog.csdnimg.cn/20200304105555534.png)
![在文件夹目录下的文件,对应Map的结构](https://img-blog.csdnimg.cn/2020030410560741.png)