Java ZIp 压缩和解压

来源:互联网 发布:东航巴黎昆明 知乎. 编辑:程序博客网 时间:2024/05/02 04:34
<span style="font-size:24px;">Java ZIP的压缩工具:</span>
package stu.love.zip;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.zip.ZipEntry;ytil.zip.ZipOutputStream;/** * 程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(compression) * 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。 * 在本段代码中,实现的是压缩部分;解压部分见本包中UnZipFiels部分。 *  * @author hello *  */public class ZipCompressing {private static int k = 1;//定义 递归次数的标记!public ZipCompressing() {// TODO Auto-generated constructor stub}public static void main(String[] args) throws IOException {zipCompress("D:\\loveyouvewry.zip",new File("C:\\lvoe\\temp\\a.log"));}/** *  * 压缩文件或者文件夹 *  * @param zipFilename   指定压缩文件的路径 * @param in需要压缩的文件 * @throws IOException  */private static void zipCompress(String zipFilepath,File in) throws IOException{System.out.println("开始压缩");ZipOutputStream out = null;BufferedOutputStream buf = null;try {out = new ZipOutputStream(new FileOutputStream(zipFilepath));buf = new BufferedOutputStream(out);//调用压缩方法 使用了递归调用zip(out, in, in.getName(), buf);} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}finally{try {out.close();buf.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println("压缩结束");}/** *  * //递归压缩的方法 *  * @param out   zip压缩输出流 * @param f需要压缩的文件 * @param base压缩文件的名字,作为 条目的 名字! * @param bo缓冲输出流! 写入文件! * @throws IOException  */private static void zip(ZipOutputStream out,File f,String base,BufferedOutputStream bo) throws IOException{if(f.isDirectory()){//1 是文件夹 需要判断 是否有文件?File[] files = f.listFiles();if(files.length == 0){out.putNextEntry(new ZipEntry(base+"/"));System.out.println("base="+base);}for(int i=0;i<files.length;i++){//递归调用!zip(out, f, base, bo);}System.out.println("第" + k + "次递归");k++;}else{//2 是文件的话直接 读取文件 写入数据!out.putNextEntry(new ZipEntry(base));System.out.println("base="+base);FileInputStream in= new FileInputStream(f);byte[] arr = new byte[1024];int len = 0;while((len= in.read(arr))!= -1){//写入zip文件中!bo.write(arr);bo.flush();}in.close();out.close();bo.close();}}}

 二    解压缩:

package stu.love.zip;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;public class unZipFiles {public unZipFiles() {// TODO Auto-generated constructor stub}public static void main(String[] args) throws IOException {File zipFile = new File("D:\\android2\\Wireshark.zip");String descDir = "D:\\Use\\"; unZipFiles.unZipFiles(zipFile, descDir);}/** * 解压到指定目录 * @param zipPath * @param descDir * @author isea533 */public static void unZipFiles(String zipPath,String descDir)throws IOException{unZipFiles(new File(zipPath), descDir);}/** * 解压文件到指定目录 * @param zipFile * @param descDir * @author isea533 */@SuppressWarnings("rawtypes")public static void unZipFiles(File zipFile,String descDir)throws IOException{File pathFile = new File(descDir);if(!pathFile.exists()){pathFile.mkdirs();}ZipFile zip = new ZipFile(zipFile);for(Enumeration entries = zip.entries();entries.hasMoreElements();){ZipEntry entry = (ZipEntry)entries.nextElement();String zipEntryName = entry.getName();InputStream in = zip.getInputStream(entry);String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;//判断路径是否存在,不存在则创建文件路径File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));if(!file.exists()){file.mkdirs();}//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压if(new File(outPath).isDirectory()){continue;}//输出文件路径信息System.out.println(outPath);OutputStream out = new FileOutputStream(outPath);byte[] buf1 = new byte[1024];int len;while((len=in.read(buf1))>0){out.write(buf1,0,len);}in.close();out.close();}System.out.println("******************解压完毕********************");}}


0 0