Java 的zip压缩和解压缩
好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代码如下:
package com.meritit.utils.zip; import java.io.BufferedInputStream; 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.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; /** * @function 实现把指定文件夹下的所有文件压缩为指定文件夹下指定 zip 文件&&实现把指定文件夹下的 zip 文件解压到指定目录下 * @createDate:2013-09-18 * @author Ysjian */ public final class ZIPUtils { /** * 测试 * * @param args * @throws IOException * @throws ZipException */ public static void main(String[] args) throws ZipException, IOException { // 把E:\Ysjian_Job\osgistart文件夹下的所有文件压缩到 E:\test.jar中 zip("E:\test.xlsx", "E:\test.jar"); // 把E:\test.jar 压缩文件内的所有文件解压到 E:\test目录下面 unZip("E:\test.jar", "E:\test"); } private ZIPUtils() { } /** * sourceFile 文件进行 zip * 格式的压缩,如果sourceFile是目录,就将sourceFile目录下所有的文件及子目录压缩,如果sourceFile是文件 * ,将sourceFile文件压缩,保存为指定 .zip或者.jar 文件 * * @param sourceFile * 源文件, * @param savedFile * 保存的文件,可以是.zip或者.jar形式 * */ public static void zip(String sourceFile, String savedFile) { ZipOutputStream zos = null; try { zos = new ZipOutputStream(new BufferedOutputStream( new FileOutputStream(savedFile))); File file = new File(sourceFile); @SuppressWarnings("unused") boolean zip = file.isDirectory() ? zipFile(file, file.getPath(), zos) : zipFile(file, file.getParent(), zos); } catch (FileNotFoundException e) { throw new RuntimeException("filePath is invalid-->" + savedFile, e); } finally { try { zos.closeEntry(); zos.close(); } catch (IOException e) { throw new RuntimeException("fail to close the ZipOutputStream", e); } } } /** * 压缩文件,利用到了递归 * * @param source * @param basePath * @param zos * @throws IOException */ private static boolean zipFile(File source, String basePath, ZipOutputStream zos) { File[] files = null; if (source.isDirectory()) { files = source.listFiles(); } else { files = new File[1]; files[0] = source; } String path = null; byte[] buf = new byte[1024]; int length = 0; BufferedInputStream bis = null; try { for (File file : files) { if (file.isDirectory()) { path = file.getPath().substring(basePath.length() + 1) + "/"; zos.putNextEntry(new ZipEntry(path)); zipFile(file, basePath, zos); } else { path = file.getPath().substring(basePath.length() + 1); bis = new BufferedInputStream(new FileInputStream(file)); zos.putNextEntry(new ZipEntry(path)); while ((length = bis.read(buf)) > 0) { zos.write(buf, 0, length); } } } } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { throw new RuntimeException( "fail to close the ZipOutputStream", e); } } } return true; } /** * 解压 zip 文件,只能解压标准的 zip文件 * * @param sourceFile * 标准的 zip 文件,不能是把 rar 的直接改为 zip 这样会出现java.io.IOException * @param targetDir * 存放的目錄 * @throws ZipException * @throws IOException */ @SuppressWarnings("resource") public static void unZip(String sourceFile, String targetDir) throws ZipException, IOException { targetDir = targetDir.endsWith("//") ? targetDir : targetDir + "//"; byte b[] = new byte[1024]; ZipFile zipFile = null; BufferedOutputStream bos = null; zipFile = new ZipFile(new File(sourceFile)); Enumeration<?> enumeration = zipFile.entries(); while (enumeration.hasMoreElements()) { ZipEntry zipEntry = (ZipEntry) enumeration.nextElement(); File loadFile = new File(targetDir + zipEntry.getName()); if (!zipEntry.isDirectory()) { if (!loadFile.getParentFile().exists()) { loadFile.getParentFile().mkdirs(); } OutputStream os = new FileOutputStream(loadFile); InputStream inputStream = zipFile.getInputStream(zipEntry); bos = new BufferedOutputStream(os); int length = 0; while ((length = inputStream.read(b)) > 0) { bos.write(b, 0, length); } } } } }最近工作利用了OSGi,需要在代码中手动生成jar包,也就是bundle,所以采用了这种技术去生成jar包。利用了zip压缩,将事先用eclipse生成的bundle的jar包解压出来,在向里面添加自己的文件,然后在压缩成jar。