校验和为Adler的压缩

@Test
public void testMulZip(){
try(
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("e:/java.zip"));//创建目录等待zos读取文件到压缩目录中
){
String str = "C:\\Users\\Jimin\\Desktop\\three\\three";//目录
File file = new File(str);//创建目录
File[] listFiles = file.listFiles(f->f.isFile());//过滤目录中的文件,即提取文件到listFiles中
// Stream.of(listFiles).forEach(System.out::println);

String strRe = ".*(Users\\\\.*)";//String strRe = ".*(Users/.*)"; 正则表达式
Pattern pattern = Pattern.compile(strRe);//正则表达式的编译

int i=0;
String entryName[] = new String[listFiles.length];//创建数组,用于接收文件名

for(File temp:listFiles){

String sStr = temp.toString();//文件名转为字符串
// String replace = sStr.replace('\\', '/');//转义\转为非转义的/
Matcher matcher = pattern.matcher(sStr);//文件名与正则匹配
if(matcher.find()){//匹配是否找到
String group1 = matcher.group(1);//找到取组一,即截断部分字符
System.out.println(group1);
entryName[i] = group1;//把截取到的字符放到数组中
}
i++;//数组下标加一

}

Adler32 adler = new Adler32();//Adler加密对象的创建


for(i = 0;i<entryName.length;i++){//判断数组的长度
ZipEntry entry = new ZipEntry(entryName[i]);//用数组的字符串创建压缩文件的文件名
zos.putNextEntry(entry);//把文件名放到一开始创建的压缩文件中
byte arr[] = Files.readAllBytes(listFiles[i].toPath());//文件名转为路径名,读取所有文件到数组arr中

adler.update(arr);//用特定的字节数组arr更新校验和
long value = adler.getValue();//得到检查码的值
entry.setCrc(value);//设置entry条目的CRC-32校验和
//写入内容
zos.write(arr);
zos.closeEntry();//关闭
adler.reset();//重置校验和为初始值
}

}catch(Exception e){
e.printStackTrace();
}
}

posted @ 2018-07-21 20:59  智敏罗  阅读(173)  评论(0编辑  收藏  举报