Java压缩和解压缩

来源:互联网 发布:档案归类软件 编辑:程序博客网 时间:2024/04/29 00:41


public class ZipUtil {private static List list = new ArrayList();public static void main(String argv[]) {try {byte b[] = new byte[512];// 压缩文件的保存路径String zipFile = "D:/ziptest/test.zip";// 压缩文件目录String filepath = "D:/ziptest/";List fileList = allFile(filepath);FileOutputStream fileOutputStream = new FileOutputStream(zipFile);// 使用输出流检查CheckedOutputStream cs = new CheckedOutputStream(fileOutputStream,new CRC32());// 声明输出zip流ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(cs));for (int i = 0; i < fileList.size(); i++) {InputStream in = new FileInputStream((String) fileList.get(i));String fileName = ((String) (fileList.get(i))).replace(File.separatorChar, '/');System.out.println("ziping " + fileName);fileName = fileName.substring(fileName.indexOf("/") + 1);ZipEntry e = new ZipEntry(fileName);out.putNextEntry(e);int len = 0;while ((len = in.read(b)) != -1) {out.write(b, 0, len);}out.closeEntry();}out.close();System.out.println("done!");} catch (Exception e) {e.printStackTrace();}}private static List allFile(String path) {File file = new File(path);String[] array = null;String sTemp = "";if (file.isDirectory()) {} else {return null;}array = file.list();if (array.length > 0) {for (int i = 0; i < array.length; i++) {sTemp = path + array[i];file = new File(sTemp);if (file.isDirectory()) {allFile(sTemp + "/");} else {list.add(sTemp);}}} else {return null;}return list;}}


public class Zip {    private static final int BUFFER = 1024;// Length of buffer    private long length = 0;// A uncompress directory's length        /**  * Compress files to *.zip.  * @param fileName: file to be compress  */    public void compress(String fileName) {    String targetFile = null;    File sourceFile = new File(fileName);    Vector<File> vector = getAllFiles(sourceFile);        try {        if (sourceFile.isDirectory()) {        targetFile = fileName + ".zip";        } else {        char ch = '.'; targetFile = fileName.substring(0, fileName.lastIndexOf((int)ch)) + ".zip";        }        BufferedInputStream bis = null;            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile));            ZipOutputStream zipos = new ZipOutputStream(bos);            byte data[] = new byte[BUFFER];            for (int i=0; i<vector.size(); i++) {            File file = (File)vector.get(i);            zipos.putNextEntry(new ZipEntry(getEntryName(fileName, file)));            bis = new BufferedInputStream(new FileInputStream(file));                        int count;            while ((count=bis.read(data, 0, BUFFER)) != -1 ) {            zipos.write(data, 0, count);            }            bis.close();            zipos.closeEntry();            }            zipos.close();            bos.close();            showDetail(sourceFile, new File(targetFile));         } catch (IOException e) {            e.printStackTrace();        }    }        /**     * Uncompress *.zip files.     * @param fileName: file to be uncompress     */    public void uncompress(String fileName) {    File sourceFile = new File(fileName);    String filePath = sourceFile.getParent() + "/";    try {    BufferedInputStream bis = null;    BufferedOutputStream bos = null;    ZipFile zipFile = new ZipFile(fileName);    Enumeration en = zipFile.entries();    byte data[] = new byte[BUFFER];    while (en.hasMoreElements()) {    ZipEntry entry = (ZipEntry)en.nextElement();    if (entry.isDirectory()) {    new File(filePath + entry.getName()).mkdirs();    continue;    }    bis = new BufferedInputStream(zipFile.getInputStream(entry));    File file = new File(filePath + entry.getName());    File parent = file.getParentFile();    if (parent!=null && (!parent.exists())) {    parent.mkdirs();    }    bos = new BufferedOutputStream(new FileOutputStream(file));    int count;    while ((count=bis.read(data, 0, BUFFER)) != -1) {    bos.write(data, 0, count);    }    bis.close();    bos.close();    }    zipFile.close();    } catch(IOException e) {    e.printStackTrace();    }    }        /**     * To get a directory's all files.     * @param sourceFile: the source directory     * @return the files' collection     */    private Vector<File> getAllFiles(File sourceFile) {    Vector<File> fileVector = new Vector<File>();    if (sourceFile.isDirectory()) {    File[] files = sourceFile.listFiles();    for (int i=0; i<files.length; i++) {    fileVector.addAll(getAllFiles(files[i]));    }    } else {    fileVector.add(sourceFile);    }    return fileVector;    }    private String getEntryName(String base,File file) {        File baseFile=new File(base);        String filename=file.getPath();        if(baseFile.getParentFile().getParentFile()==null)            return filename.substring(baseFile.getParent().length());        return filename.substring(baseFile.getParent().length()+1);    }        /**     * Show the compress or uncompress detail.     * @param sourceFile: the source file     * @param targetFile: the target file     */    private void showDetail(File sourceFile, File targetFile) {    long sourceFileLength = getDirectoryLength(sourceFile);    long targetFileLength = targetFile.length();    System.out.println("The uncompress file's size is " + sourceFileLength + " bytes.");    System.out.println("The compress file's size is " + targetFileLength + " bytes.");    System.out.println("The compress rate is " + ((double)(sourceFileLength-targetFileLength)/(double)sourceFileLength)*100 + "%");    }        /**     * Get length of a directory.     * @param path: the directory     * @return the length of directory     */    private long getDirectoryLength(File path) {    if (path.isDirectory()) {    File[] files = path.listFiles();    for (int i=0; i<files.length; i++) {    getDirectoryLength(files[i]);    }    } else {    length += path.length();    }    return length;    }        public static void main(String[] args) {//    if (args.length != 2) {// System.out.println("Usage: java ZipCompress zip/unzip E:/java/apps/zip/text");// return ;// }// Zip zip = new Zip();// if (args[0].equals("zip")) {// zip.compress(args[1]);// } else if(args[0].equals("unzip")) {// zip.uncompress(args[1]);// } else {// System.out.println("Error");// } Zip zip = new Zip();    zip.compress("D:/ziptest");    }}

public class UnZip {    public static void main(String argv[]) {        try {            String outputDirectory = "D:/testzip/";            ZipFile zipFile = new ZipFile("D:/testzip/test.zip");            Enumeration e = zipFile.getEntries();            ZipEntry zipEntry = null;            createDirectory(outputDirectory, "");            while (e.hasMoreElements()) {                zipEntry = (ZipEntry) e.nextElement();                System.out.println("unziping " + zipEntry.getName());                if (zipEntry.isDirectory()) {                    String name = zipEntry.getName();                    name = name.substring(0, name.length() - 1);                    File f = new File(outputDirectory + File.separator + name);                    f.mkdir();                } else {                    String fileName = zipEntry.getName();                    fileName = fileName.replace('\\', '/');                    if (fileName.indexOf("/") != -1) {                        createDirectory(outputDirectory, fileName.substring(0,fileName.lastIndexOf("/")));                    }                    File f = new File(outputDirectory                            + zipEntry.getName());                    f.createNewFile();                    InputStream in = zipFile.getInputStream(zipEntry);                    FileOutputStream out = new FileOutputStream(f);                    byte[] by = new byte[1024];                    int c;                    while ((c = in.read(by)) != -1) {                        out.write(by, 0, c);                    }                    out.close();                    in.close();                }            }            System.out.println("done!");        } catch (Exception ex) {            System.out.println(ex.getMessage());            ex.printStackTrace();        }    }    private static void createDirectory(String directory, String subDirectory) {        String dir[];        File fl = new File(directory);        try {            if (subDirectory == "" && fl.exists() != true)                fl.mkdir();            else if (subDirectory != "") {                dir = subDirectory.replace('\\', '/').split("/");                for (int i = 0; i < dir.length; i++) {                    File subFile = new File(directory + File.separator + dir[i]);                    if (subFile.exists() == false)                        subFile.mkdir();                    directory += File.separator + dir[i];                }            }        } catch (Exception ex) {            System.out.println(ex.getMessage());        }    }}

















0 0