java 对文件夹或者文件的压缩和解压缩的事例

事例用的是org.apache.tools.zip包下面的一些类,jdk自带的zip工具类当文件名是中文的情况下会出现问题,本事例可以递归压缩文件和解压文件,功能上和现在常用的一些压缩软件功能类似,暂时没有做性能上的对比。
package zip;

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.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

@SuppressWarnings("rawtypes")
public class TestAntZip {
	public static void main(String[] args) {
        //Unzip();
		//ZipFile();
	}

	/**
	 * 压缩文件或者文件夹
	 */
	private static void ZipFile() {
		try {
			String inputStr = "D:/testzip";
			File input = new File(inputStr);
                        String singleFile = null;
			if (input.isFile()) {
			  int temp = input.getName().lastIndexOf(".");
		          singleFile = input.getName().substring(0, temp);
			}
			String basepath = input.getName();
                        String zipfilename = singlefile != null ? singlefile : input.getName();
			ZipOutputStream zos = new ZipOutputStream(new File(input.getParent(), zipfilename + ".zip"));
			zos.setEncoding("UTF-8");
			PutEntry(zos, input, basepath);
			zos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void PutEntry(ZipOutputStream zos, File file, String basepath) throws IOException, FileNotFoundException {
		FileInputStream is = null;
		byte[] b = new byte[1024 * 10];
		int tmp = 0;
		basepath += File.separator;
		if (file.isFile()) {
			zos.putNextEntry(new ZipEntry(basepath));
			is = new FileInputStream(file);
			while ((tmp = is.read(b, 0, b.length)) != -1) {
				zos.write(b, 0, tmp);
			}
			is.close();
		} else {
			for (File f : file.listFiles()) {
				PutEntry(zos, f, basepath + f.getName());
			}
		}
		zos.flush();
	}

	/**
	 * 解压缩
	 */
	private static void Unzip() {
		String file = "d:/testzip.zip";
		File zipFile = new File(file);
		int i = file.lastIndexOf(".");
        File filePath = new File(file.substring(0, i));
        if (!filePath.exists()) {
            filePath.mkdirs();
        }
        File temp = null;
        try {
            ZipFile zip = new ZipFile(zipFile, "UTF-8");
            ZipEntry entry = null;
            byte[] b = new byte[1024 * 10];
            int tmp = 0;
            
            FileOutputStream os = null;
            InputStream is = null;
            for (Enumeration enu = zip.getEntries(); enu.hasMoreElements();) {
            	entry = (ZipEntry) enu.nextElement();
            	is = zip.getInputStream(entry);
            	temp = new File(filePath.getParent() + File.separator + entry.getName());
            	if (!temp.getParentFile().exists()) {
            		temp.getParentFile().mkdirs();
            	}
            	os = new FileOutputStream(temp);
            	while ((tmp = is.read(b, 0, b.length)) != -1) {
            		os.write(b, 0, tmp);
            	}
            	os.flush();
                os.close();
                is.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
}



你可能感兴趣的:(java,apache,zip)