代码压缩实现 package com.hjh.demo.zip;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.util.zip.CR
package com.hjh.demo.zip; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; //使用org.apache.tools.zip这个就不会中文乱码 来自于ant.jar import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; //使用java.util.zip原生ZipOutputStream与ZipEntry会中文乱码 //import java.util.zip.ZipOutputStream; //import java.util.zip.ZipEntry; public class TestZip { static String filePath = "F:/test/json.txt";//需要压缩的文件夹完整路径 static String fileName = "zip";//需要压缩的文件夹名 static String outPath = "F:/test/zip/Test.zip";//压缩完成后保存为Test.zip文件,名字随意 public static void main(String args[]) throws Exception { OutputStream is = new FileOutputStream(outPath);//创建Test.zip文件 CheckedOutputStream cos = new CheckedOutputStream(is, new CRC32());//检查输出流,采用CRC32算法,保证文件的一致性 ZipOutputStream zos = new ZipOutputStream(cos);//创建zip文件的输出流 zos.setEncoding("GBK");//设置编码,防止中文乱码 File file = new File(filePath);//需要压缩的文件或文件夹对象 // ZipFile(zos,file);//压缩文件的具体实现函数 zipFileContent(zos,file); zos.close(); cos.close(); is.close(); System.out.println("压缩完成"); } public static void zipFileContent(ZipOutputStream zos,File file) throws Exception { if(file.isDirectory()) { for(File f : file.listFiles()) { zipFileContent(zos, f); } } else { //用字节方式读取源文件 InputStream is = new FileInputStream(file.getPath()); //创建一个缓存区 BufferedInputStream bis = new BufferedInputStream(is); //字节数组,每次读取1024个字节 byte [] b = new byte[1024]; zos.putNextEntry(new ZipEntry(file.getName())); //循环读取,边读边写 while(bis.read(b) != -1) { zos.write(b);//写入压缩文件 } //关闭流 bis.close(); is.close(); } } //递归,获取需要压缩的文件夹下面的所有子文件,然后创建对应目录与文件,对文件进行压缩 public static void ZipFile(ZipOutputStream zos,File file) throws Exception { if(file.isDirectory()) { //创建压缩文件的目录结构 zos.putNextEntry(new ZipEntry(file.getPath().substring(file.getPath().indexOf(fileName))+File.separator)); for(File f : file.listFiles()) { ZipFile(zos,f); } } else { //打印输出正在压缩的文件 System.out.println("正在压缩文件:"+file.getName()); //创建压缩文件 zos.putNextEntry(new ZipEntry(file.getPath().substring(file.getPath().indexOf(fileName)))); //用字节方式读取源文件 InputStream is = new FileInputStream(file.getPath()); //创建一个缓存区 BufferedInputStream bis = new BufferedInputStream(is); //字节数组,每次读取1024个字节 byte [] b = new byte[1024]; //循环读取,边读边写 while(bis.read(b)!=-1) { zos.write(b);//写入压缩文件 } //关闭流 bis.close(); is.close(); } } }代码解压实现
package com.hjh.demo.zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.zip.CRC32; import java.util.zip.CheckedInputStream; //使用org.apache.tools.zip这个就不会中文乱码 来自于ant.jar import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; //使用java.util.zip原生ZipOutputStream与ZipEntry会中文乱码 //import java.util.zip.ZipEntry; //import java.util.zip.ZipFile; public class TestUnzip { static String zipPath = "F:/test/zip/Test.zip";//需要解压的压缩文件 static String outPath = "F:/test/zip/unzip/";//解压完成后保存路径,记得"\\"结尾哈 public static void main(String args[]) throws Exception { ZipFile zipFile = new ZipFile(zipPath,"GBK");//压缩文件的实列,并设置编码 //获取压缩文中的所以项 for(Enumerationenumeration = zipFile.getEntries();enumeration.hasMoreElements();) { ZipEntry zipEntry = enumeration.nextElement();//获取元素 System.out.println("解压到的条目 : " + zipEntry.getName()); //排除空文件夹 if(!zipEntry.getName().endsWith(File.separator)) { // System.out.println("正在解压文件:"+zipEntry.getName());//打印输出信息 OutputStream os = new FileOutputStream(outPath+zipEntry.getName());//创建解压后的文件 BufferedOutputStream bos = new BufferedOutputStream(os);//带缓的写出流 InputStream is = zipFile.getInputStream(zipEntry);//读取元素 BufferedInputStream bis = new BufferedInputStream(is);//读取流的缓存流 CheckedInputStream cos = new CheckedInputStream(bis, new CRC32());//检查读取流,采用CRC32算法,保证文件的一致性 byte [] b = new byte[1024];//字节数组,每次读取1024个字节 //循环读取压缩文件的值 while(cos.read(b)!=-1) { bos.write(b);//写入到新文件 } cos.close(); bis.close(); is.close(); bos.close(); os.close(); } else { //如果为空文件夹,则创建该文件夹 new File(outPath+zipEntry.getName()).mkdirs(); } } System.out.println("解压完成"); zipFile.close(); } }