java小技巧之文件的压缩与解压缩

记录一下java SE中的文件压缩与解压缩的工具使用

 

代码如下


public class ZipUtils {
    public static final String TAG = "ZIP";

    public ZipUtils() {
    }

    /**
     * 解压zip到指定的路径
     *
     * @param zipFileString ZIP的名称
     * @param outPathString 要解压缩路径
     * @throws Exception
     */
    public static boolean UnZipFolder(String zipFileString, String outPathString) {
        try {
            ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
            ZipEntry zipEntry;
            String szName = "";
            while ((zipEntry = inZip.getNextEntry()) != null) {
                szName = zipEntry.getName();
                if (zipEntry.isDirectory()) {
                    //获取部件的文件夹名
                    szName = szName.substring(0, szName.length() - 1);
                    File folder = new File(outPathString + File.separator + szName);
                    folder.mkdirs();
                } else {
                    Log.e(TAG, outPathString + File.separator + szName);
                    File file = new File(outPathString + File.separator + szName);
                    if (!file.exists()) {
                        Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);
                        file.getParentFile().mkdirs();
                        file.createNewFile();
                    }
                    // 获取文件的输出流
                    FileOutputStream out = new FileOutputStream(file);
                    int len;
                    byte[] buffer = new byte[1024];
                    // 读取(字节)字节到缓冲区
                    while ((len = inZip.read(buffer)) != -1) {
                        // 从缓冲区(0)位置写入(字节)字节
                        out.write(buffer, 0, len);
                        out.flush();
                    }
                    out.close();
                }
            }
            inZip.close();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public static void UnZipFolder(String zipFileString, String outPathString, String szName) throws Exception {
        ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
        ZipEntry zipEntry;
        while ((zipEntry = inZip.getNextEntry()) != null) {
            //szName = zipEntry.getName();
            if (zipEntry.isDirectory()) {
                //获取部件的文件夹名
                szName = szName.substring(0, szName.length() - 1);
                File folder = new File(outPathString + File.separator + szName);
                folder.mkdirs();
            } else {
                Log.e(TAG, outPathString + File.separator + szName);
                File file = new File(outPathString + File.separator + szName);
                if (!file.exists()) {
                    Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);
                    file.getParentFile().mkdirs();
                    file.createNewFile();
                }
                // 获取文件的输出流
                FileOutputStream out = new FileOutputStream(file);
                int len;
                byte[] buffer = new byte[1024];
                // 读取(字节)字节到缓冲区
                while ((len = inZip.read(buffer)) != -1) {
                    // 从缓冲区(0)位置写入(字节)字节
                    out.write(buffer, 0, len);
                    out.flush();
                }
                out.close();
            }
        }
        inZip.close();
    }

    /**
     * 压缩文件和文件夹
     *
     * @param srcFileString 要压缩的文件或文件夹
     * @param zipFileString 解压完成的Zip路径
     * @throws Exception
     */
    public static void ZipFolder(String srcFileString, String zipFileString) throws Exception {
        //创建ZIP
        ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString));
        //创建文件
        File file = new File(srcFileString);

        //压缩
        ZipFiles(file.getParent() + File.separator, file.getName(), outZip);
        //完成和关闭
        outZip.finish();
        outZip.close();
    }

    public static void ZipFolders(String srcFileString, String zipFileString) throws Exception {
        //创建ZIP
        ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString));
        //创建文件
        File file = new File(srcFileString);
        File list[] = file.listFiles();
        if(list!=null && list.length>0){
            for(int i=0;i<list.length;i++){
                if(list[i].isFile()){
                    ZipEntry zipEntry = new ZipEntry(list[i].getName());
                    FileInputStream inputStream = new FileInputStream(list[i]);
                    outZip.putNextEntry(zipEntry);
                    int len;
                    byte[] buffer = new byte[4096];
                    while ((len = inputStream.read(buffer)) != -1) {
                        outZip.write(buffer, 0, len);
                    }
                    outZip.closeEntry();
                }else{
                    //压缩
                    ZipFiles(list[i].getParent() + File.separator, list[i].getName(), outZip);
                }
            }
        }
        //完成和关闭
        outZip.finish();
        outZip.close();
    }

    /**
     * 压缩文件
     *
     * @param folderString
     * @param fileString
     * @param zipOutputSteam
     * @throws Exception
     */
    private static void ZipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam) throws Exception {
        if (zipOutputSteam == null)
            return;
        File file = new File(folderString + fileString);
        if (file.isFile()) {
            ZipEntry zipEntry = new ZipEntry(fileString);
            FileInputStream inputStream = new FileInputStream(file);
            zipOutputSteam.putNextEntry(zipEntry);
            int len;
            byte[] buffer = new byte[4096];
            while ((len = inputStream.read(buffer)) != -1) {
                zipOutputSteam.write(buffer, 0, len);
            }
            zipOutputSteam.closeEntry();
        } else {
            //文件夹
            String fileList[] = file.list();
            //没有子文件和压缩
            if (fileList.length <= 0) {
                ZipEntry zipEntry = new ZipEntry(fileString + File.separator);
                zipOutputSteam.putNextEntry(zipEntry);
                zipOutputSteam.closeEntry();
            }
            //子文件和递归
            for (int i = 0; i < fileList.length; i++) {
                ZipFiles(folderString, fileString + File.separator + fileList[i], zipOutputSteam);
            }
        }
    }

    /**
     * 返回zip的文件输入流
     *
     * @param zipFileString zip的名称
     * @param fileString    ZIP的文件名
     * @return InputStream
     * @throws Exception
     */
    public static InputStream UpZip(String zipFileString, String fileString) throws Exception {
        ZipFile zipFile = new ZipFile(zipFileString);
        ZipEntry zipEntry = zipFile.getEntry(fileString);
        return zipFile.getInputStream(zipEntry);
    }

    /**
     * 返回ZIP中的文件列表(文件和文件夹)
     *
     * @param zipFileString  ZIP的名称
     * @param bContainFolder 是否包含文件夹
     * @param bContainFile   是否包含文件
     * @return
     * @throws Exception
     */
    public static List<File> GetFileList(String zipFileString, boolean bContainFolder, boolean bContainFile) throws Exception {
        List<File> fileList = new ArrayList<File>();
        ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
        ZipEntry zipEntry;
        String szName = "";
        while ((zipEntry = inZip.getNextEntry()) != null) {
            szName = zipEntry.getName();
            if (zipEntry.isDirectory()) {
                // 获取部件的文件夹名
                szName = szName.substring(0, szName.length() - 1);
                File folder = new File(szName);
                if (bContainFolder) {
                    fileList.add(folder);
                }
            } else {
                File file = new File(szName);
                if (bContainFile) {
                    fileList.add(file);
                }
            }
        }
        inZip.close();
        return fileList;
    }
}

我自己用的类

public class ZipUtil {

	private static ZipCompress zipCompress;

	public static void getZipFile(String sourceFileName, String zipFileName) {
		zipCompress = new ZipCompress(sourceFileName, zipFileName);
		try {
			zipCompress.zip();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class ZipCompress {

	private static final Logger LOGGER = Logger.getLogger(ZipCompress.class);

	/**
	 * @Fields zipFileName <简要描述>: 目的地Zip文件路径<Br/>
	 */
	private String zipFileName; //
	/**
	 * @Fields sourceFileName <简要描述>: 源文件(待压缩的文件或文件夹)路径<Br/>
	 */
	private String sourceFileName;

	public ZipCompress(String sourceFileName, String zipFileName) {
		this.zipFileName = zipFileName;
		this.sourceFileName = sourceFileName;
	}

	public void zip() throws Exception {
		// File zipFile = new File(zipFileName);
		// System.out.println("压缩中...");
		LOGGER.info("ZipCompress#zip() 压缩中... ");

		// 创建zip输出流
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));

		// 创建缓冲输出流
		BufferedOutputStream bos = new BufferedOutputStream(out);

		File sourceFile = new File(sourceFileName);

		// 调用函数
		compressSub(out, bos, sourceFile, sourceFile.getName());

		bos.close();
		out.close();

		LOGGER.info("ZipCompress#zip() 压缩完成 ");

	}

	/**
	 * <简要描述>: 打包文件夹及其子文件成一个zip包<Br/>
	 * 
	 */
	public void compress(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base) throws Exception {
		// 如果路径为目录(文件夹)
		if (sourceFile.isDirectory()) {

			// 取出文件夹中的文件(或子文件夹)
			File[] flist = sourceFile.listFiles();

			// 如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
			if (flist.length == 0) {
				// System.out.println(base + "/");
				LOGGER.info(base + "/");
				out.putNextEntry(new ZipEntry(base + "/"));
			} else {
				// 如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
				for (int i = 0; i < flist.length; i++) {
					compress(out, bos, flist[i], base + "/" + flist[i].getName());
				}
			}
		} else {
			// 如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
			out.putNextEntry(new ZipEntry(base));
			FileInputStream fos = new FileInputStream(sourceFile);
			BufferedInputStream bis = new BufferedInputStream(fos);

			int tag;
			// System.out.println(base);
//			LOGGER.info(base);
			// 将源文件写入到zip文件中
			while ((tag = bis.read()) != -1) {
				out.write(tag);
			}
			out.flush();
			bis.close();
			fos.close();
		}
	}

	/**
	 * <简要描述>: 只压缩当前文件夹下的子文件及子文件夹 <Br/>
	 * 	
	 */
	public void compressSub(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base)
			throws Exception {

		if (!sourceFile.isDirectory()) {
			compressDir(out, bos, sourceFile, base);
		} else {
			File[] listFiles = sourceFile.listFiles();
			for (File file : listFiles) {
				compressDir(out, bos, file, file.getName());
			}
		}
	}

	/**  
	 * <简要描述>: 压缩当前文件夹下左右文件及子文件,解压后有一级目录<Br/>
	 *  @param out
	 *  @param bos
	 *  @param sourceFile
	 *  @param base
	 *  @throws Exception 
	 * @return void 
	 */  
	public void compressDir(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base)
			throws Exception {
		// 如果路径为目录(文件夹)
		if (sourceFile.isDirectory()) {

			// 取出文件夹中的文件(或子文件夹)
			File[] flist = sourceFile.listFiles();

			// 如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
			if (flist.length == 0) {
				// System.out.println(base + "/");
				LOGGER.info(base + "/");
				out.putNextEntry(new ZipEntry(base + "/"));
			} else {
				// 如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
				for (int i = 0; i < flist.length; i++) {
					compress(out, bos, flist[i], base + "/" + flist[i].getName());
				}
			}
		} else {
			// 如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
			out.putNextEntry(new ZipEntry(base));
			FileInputStream fos = new FileInputStream(sourceFile);
			BufferedInputStream bis = new BufferedInputStream(fos);

			int tag;
			LOGGER.info(base);
			// 将源文件写入到zip文件中
			while ((tag = bis.read()) != -1) {
				out.write(tag);
			}
			out.flush();
			bis.close();
			fos.close();
		}
	}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值