1.6.5,压缩、解压缩辅助类代码

有的时候,需要做文件的压缩、解压缩。

java自身提供了已压缩,解压缩的原生类库。不过有开源代码的话,我一般是选择使用开源类库。

下面就贴一下,我使用ant-1.6.5的zip压缩、解压缩的代码吧。

ZipUtil.java

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.zip.CRC32;import org.apache.tools.ant.Project;import org.apache.tools.ant.taskdefs.Expand;import org.apache.tools.ant.taskdefs.Zip;import org.apache.tools.ant.types.FileSet;import org.apache.tools.ant.types.ZipFileSet;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipFile;import org.apache.tools.zip.ZipOutputStream;/** * <p> * Title: 压缩、解压缩,辅助类 * </p> * * @author mahh */public class ZipUtil {// ==========================================================================// 压缩文件方法1// ==========================================================================/** * @Description: 压缩一个文件夹或者一个文件 * @param sourceFilePath *源文件夹或者源文件 * @param destZip *压缩后的zip文件 * @author mahh * @since:2015-2-28 上午09:36:32 */public static void zip1(String sourceFilePath, String destZip) {FileUtil.createParentFile(destZip); // 目标文件不存在就创建一个Project project = new Project();Zip zip = new Zip();zip.setProject(project);zip.setDestFile(new File(destZip));// 设置生成的目标zip文件File对象FileSet fileSet = new FileSet();fileSet.setProject(project);File sourceFile1 = new File(sourceFilePath);if (sourceFile1.isDirectory()) {fileSet.setDir(sourceFile1);// 设置将要进行压缩的源文件File对象// fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹,只压缩目录中的所有java文件// fileSet.setExcludes("**/*.java"); //排除哪些文件或文件夹,压缩所有的文件,排除java文件} else {fileSet.setFile(sourceFile1);// 设置将要进行压缩的源文件File对象}// 增加一个Fileset。 Zip中可以增加多个Filesetzip.addFileset(fileSet);zip.execute();}/** * @Description:解压缩 * @param sourceZipFilePath *源压缩文件zip * @param destZipDir *解压缩到文件夹路径 * @return * @author mahh * @since:2015-2-28 下午04:57:28 */public static void unZip1(String sourceZipFilePath, String destZipDir) {FileUtil.createDir(destZipDir);Project proejct = new Project();Expand expand = new Expand();expand.setProject(proejct);expand.setSrc(new File(sourceZipFilePath));expand.setOverwrite(false);// 是否覆盖// 如果不写,非常可能出现解压缩后文件的文件名(包含中文)出现乱码expand.setEncoding(System.getProperty("sun.jnu.encoding"));File file = new File(destZipDir);expand.setDest(file);expand.execute();}// ==========================================================================// 压缩文件方法2// ==========================================================================/** * @Description: 将一组文件压缩到一个压缩文件中 * @param list *一组被压缩的源文件,文件不能是目录 * @param destZipFilePath *生成zip文件绝对路径 * @param inZipBasePath *被压缩文件在zip内,相对路径(如a/b/c),默认在ZIP根目录下。 * @return * @author mahh * @since:2015-2-28 下午05:09:33 */public static File zip2(List<File> list, String destZipFilePath,String inZipBasePath) {if (inZipBasePath == null) {inZipBasePath = "";}inZipBasePath = buildFilePath(inZipBasePath);File zipFile = FileUtil.createNewFile(destZipFilePath);// 目标文件不存在就创建一个ZipOutputStream out = null;try {out = new ZipOutputStream(new FileOutputStream(zipFile));for (int i = 0; i < list.size(); i++) {File file = list.get(i);if (!file.exists()) {continue;}if (file.isDirectory()) {doZipFolder(inZipBasePath, out, file);} else {doZipFile(inZipBasePath, out, file);}}return zipFile;} catch (IOException e) {throw new RuntimeException(e);} finally {closeZipOutStream(out);}}/** * @Description: 只压缩一个文件夹自己(不包含文件夹内部内容) */private static void doZipFolder(String inZipBasePath, ZipOutputStream out,File file) throws IOException {ZipEntry ze = new ZipEntry(inZipBasePath + FileUtil.FILE_SEPARATOR+ file.getName() + FileUtil.FILE_SEPARATOR);ze.setTime(new Date().getTime());ze.setSize(0);ze.setMethod(ZipEntry.STORED);ze.setCrc(new CRC32().getValue());ze.setUnixMode(ZipFileSet.DEFAULT_DIR_MODE);out.putNextEntry(ze);}/** * @Description: 压缩一个文件 */private static void doZipFile(String inZipBasePath, ZipOutputStream out,File file) throws IOException {FileInputStream in = new FileInputStream(file);out.putNextEntry(new ZipEntry(inZipBasePath + FileUtil.FILE_SEPARATOR+ file.getName()));byte[] buf = new byte[1024];int len;while ((len = in.read(buf)) > 0) {out.write(buf, 0, len);}if (in != null) {in.close();}}private static void closeZipOutStream(ZipOutputStream out) {if (out == null) {return;}try {out.closeEntry();} catch (IOException e) {throw new RuntimeException(e);}try {out.close();} catch (IOException e) {throw new RuntimeException(e);}}/** * @Description: 返回字符串去除结尾的\或/ * @param path * @return * @author mahh * @since:2015-2-28 上午10:36:31 */private static String buildFilePath(final String path) {if (path == null) {return "";}String retStr = path;while (FileUtil.isFolderPath(retStr)) {if (retStr.length() < 1) {break;}retStr = retStr.substring(0, retStr.length() – 1);}return retStr;}// ==========================================================================// 解压缩文件方法2// ==========================================================================/** * @Description:解压缩 * @param sourceZipFilePath *源压缩文件zip * @param destZipDir *解压缩到文件夹路径 * @return * @author mahh * @since:2015-2-28 下午03:47:26 */@SuppressWarnings("unchecked")public static List<File> unZip2(String sourceZipFilePath, String destZipDir) {List<File> res = new ArrayList<File>();ZipFile zipFile = null;try {zipFile = new ZipFile(sourceZipFilePath);java.util.Enumeration<ZipEntry> ele = zipFile.getEntries();while (ele.hasMoreElements()) {ZipEntry zipEntry = (ZipEntry) ele.nextElement();File f = null;if (FileUtil.isFolderPath(zipEntry.getName())) {// 解压缩一个文件夹f = doUnZipFolder(destZipDir, zipFile, zipEntry);} else {// 解压缩一个文件f = doUnZipFile(destZipDir, zipFile, zipEntry);}res.add(f);}} catch (Exception e) {throw new RuntimeException("{{不是可用的zip文件!}}");} finally {try {if (zipFile != null) {zipFile.close();}} catch (IOException e) {e.printStackTrace();}}return res;}/** * @Description: 解压缩一个文件夹自己(不包含文件夹内部内容) */private static File doUnZipFolder(String destZipDir, ZipFile zipFile,ZipEntry zipEntry) throws IOException {File f = FileUtil.createNewFile(destZipDir + FileUtil.FILE_SEPARATOR+ zipEntry.getName());return f;}/** * @Description: 解压缩一个文件 */private static File doUnZipFile(String destZipDir, ZipFile zipFile,ZipEntry zipEntry) throws IOException {File f = null;InputStream in = null;FileOutputStream out = null;try {f = FileUtil.createNewFile(destZipDir + FileUtil.FILE_SEPARATOR+ zipEntry.getName());in = zipFile.getInputStream(zipEntry);out = new FileOutputStream(f);byte[] by = new byte[100000];int c;while ((c = in.read(by)) != -1) {out.write(by, 0, c);}out.flush();} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);} finally {if (in != null) {in.close(); // 解压完成后注意关闭输入流对象}if (out != null) {out.close(); // 解压完成后注意关闭输出流对象}}return f;}}FileUtil.java

积极的人在每一次忧患中都看到一个机会,

1.6.5,压缩、解压缩辅助类代码

相关文章:

你感兴趣的文章:

标签云: