java的 zip 工具类

2021-09-24 10:36:05 浏览数 (1)

代码语言:javascript复制
import java.io.;
import java.util.logging.Logger;
import java.util.zip.;
/**

Created by sunyameng on 14-3-10.
/
public class ZipUtil {
 private final static Logger logger = Logger.getLogger(ZipUtil.class.getName());
 private static final int BUFFER = 1024  10;
 /**

将指定目录压缩到和该目录同名的zip文件,自定义压缩路径
*
@param sourceFilePath 目标文件路径
@param zipFilePath    指定zip文件路径
@return
*/
public static boolean zip(String sourceFilePath, String zipFilePath,String zipFileName) {
 boolean result = false;
 File source = new File(sourceFilePath);
 if (!source.exists()) {

 logger.info(sourceFilePath   " doesn't exist.");
 return result;
 
}
 if (!source.isDirectory()) {

 logger.info(sourceFilePath   " is not a directory.");
 return result;
 
}
 File zipFile = new File(zipFilePath   File.separator   zipFileName   ".zip");
 if (zipFile.exists()) {

 logger.info(zipFile.getName()   " is already exist.");
 return result;
 
} else {

 if (!zipFile.getParentFile().exists()) {
     if (!zipFile.getParentFile().mkdirs()) {
         logger.info("cann't create file "   zipFileName);
         return result;
     }
 }
 
}
 logger.info("creating zip file...");
 FileOutputStream dest = null;
 ZipOutputStream out = null;
 try {

 dest = new FileOutputStream(zipFile);
 CheckedOutputStream checksum = new CheckedOutputStream(dest, new Adler32());
 out = new ZipOutputStream(new BufferedOutputStream(checksum));
 out.setMethod(ZipOutputStream.DEFLATED);
 compress(source, out, source.getName());
 result = true;
 
} catch (FileNotFoundException e) {

 e.printStackTrace();
 
} finally {

 if (out != null) {
     try {
         out.closeEntry();
     } catch (IOException e) {
         e.printStackTrace();
     }
     try {
         out.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
 }
 
}
 if (result) {

 logger.info("done.");
 
} else {

 logger.info("fail.");
 
}
 return result;
}
private static void compress(File file, ZipOutputStream out, String mainFileName) {
 int index = file.getAbsolutePath().indexOf(mainFileName);
 String entryName = file.getAbsolutePath().substring(index);
 //System.out.println(entryName);
 if (file.isFile()) {

 FileInputStream fi = null;
 BufferedInputStream origin = null;
 try {
     fi = new FileInputStream(file);
     origin = new BufferedInputStream(fi, BUFFER);
     ZipEntry entry = new ZipEntry(entryName);
     out.putNextEntry(entry);
     byte[] data = new byte[BUFFER];
     int count;
     while ((count = origin.read(data, 0, BUFFER)) != -1) {
         out.write(data, 0, count);
     }
 } catch (FileNotFoundException e) {
     e.printStackTrace();
 } catch (IOException e) {
     e.printStackTrace();
 } finally {
     if (origin != null) {
         try {
             origin.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }
 
} else if (file.isDirectory()) {

 try {
     out.putNextEntry(new ZipEntry(entryName File.separator));
 } catch (IOException e) {
     e.printStackTrace();
 }
 File[] fs = file.listFiles();
 if (fs != null && fs.length > 0) {
     for (File f : fs) {
         compress(f, out, mainFileName);
     }
 }
 
}
}
/**

将zip文件解压到指定的目录,该zip文件必须是使用该类的zip方法压缩的文件
*
@param zipFile   要解压的zip文件
@param destPath  指定解压到的目录
@return
*/
public static boolean unzip(File zipFile, String destPath) {
 boolean result = false;
 if (!zipFile.exists()) {

 logger.info(zipFile.getName()   " doesn't exist.");
 return result;
 
}
 File target = new File(destPath);
 if (!target.exists()) {

 if (!target.mkdirs()) {
     logger.info("cann't create file "   target.getName());
     return result;
 }
 
}
 String mainFileName = zipFile.getName().replace(".zip", "");
 File targetFile = new File(destPath   File.separator   mainFileName);
 if (targetFile.exists()) {

 logger.info(targetFile.getName()   " already exist.");
 return result;
 
}
 ZipInputStream zis = null;
 logger.info("start unzip file ...");
 try {

 FileInputStream fis = new FileInputStream(zipFile);
 CheckedInputStream checksum = new CheckedInputStream(fis, new Adler32());
 zis = new ZipInputStream(new BufferedInputStream(checksum));
 ZipEntry entry;
 while ((entry = zis.getNextEntry()) != null) {
     int count;
     byte data[] = new byte[BUFFER];
     String entryName = entry.getName();
     //logger.info(entryName);
     String newEntryName = destPath   File.separator   entryName;
     newEntryName=newEntryName.replaceAll("\\", "/");
     File f = new File(newEntryName);
     if(newEntryName.endsWith("/")){
         if(!f.exists()){
             if(!f.mkdirs()) {
                 throw new RuntimeException("can't create directory "   f.getName());
             }
         }
     }else{
         File temp=f.getParentFile();
         if (!temp.exists()) {
             if (!temp.mkdirs()) {
                 throw new RuntimeException("create file "   temp.getName()   " fail");
             }
         }
         FileOutputStream fos = new FileOutputStream(f);
         BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);
         while ((count = zis.read(data, 0, BUFFER)) != -1) {
             dest.write(data, 0, count);
         }
         dest.flush();
         dest.close();
     }
 }
 result = true;
 
} catch (FileNotFoundException e) {

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

 e.printStackTrace();
 
} finally {

 if (zis != null) {
     try {
         zis.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
 }
 
}
 if (result) {

 logger.info("done.");
 
} else {

 logger.info("fail.");
 
}
 return result;
}
public static void main(String[] args) throws IOException {
//        String path="D:tempB";
//        ZipUtil.zip(path,"d:/temp/c","anhuigs123");
 String zipfile ="D:tempcB.zip";
 File zipFile = new File(zipfile);
 String output="D:tempc";
 ZipUtil.unzip(zipFile, output);
}
}




</pre> 

0 人点赞