Java壓縮或解壓文件實現

d6nd 9年前發布 | 1K 次閱讀 Java

    在處理壓縮文件的時候,其實重點的就是遞歸的使用,區分壓縮的是文件還是文件夾,并如何處理文件夾下的文件和文件夾。下面就直接把代碼貼出來

     /*   
     @Description: 壓縮解壓文件 
     */

import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.util.Enumeration;  
import java.util.zip.ZipEntry;  
import java.util.zip.ZipException;  
import java.util.zip.ZipFile;  
import java.util.zip.ZipOutputStream;  

public class Zip {  

    private static int BUFFERSIZE = 32;//緩沖流大小  
    private static FileOutputStream fileOutputStream = null;  
    private static ZipOutputStream zipOutputStream = null;  
    private static byte[] array = new byte[BUFFERSIZE];  

    /** 
     * @param outputDir 
     * @param outputFileName 
     * @throws Exception 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description:打開流 
     */  
    private static void openZipOutputStream(String outputDir, String outputFileName) throws Exception{  
        fileOutputStream = new FileOutputStream(outputDir + "\\" + outputFileName);  
        zipOutputStream = new ZipOutputStream(new BufferedOutputStream(fileOutputStream));  
    }  

    /** 
     * @throws Exception 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description:關閉流 
     */  
    private static void closeZipOutputStream() throws Exception{  
        zipOutputStream.close();  
        fileOutputStream.close();  
    }  

    /** 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description:緩存清空 
     */  
    private static void clearArrayBuffer(){  
        array = null;  
        array = new byte[BUFFERSIZE];  
    }  

    /** 
     * @param inputFile 
     * @param zipOutputStream 
     * @param base 
     * @param isPrint 
     * @throws Exception 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description:壓縮文件 
     */  
    private static void inputFileStream(File inputFile, ZipOutputStream zipOutputStream, String base,  boolean isPrint) throws Exception{  
        BufferedInputStream bufferedInputStream = null;  
        FileInputStream fileInputStream = new FileInputStream(inputFile);    
        bufferedInputStream = new BufferedInputStream(fileInputStream, BUFFERSIZE);    
        base = base.length() == 0 ? "" : base + "/";  
        if (isPrint) {  
            System.out.println(inputFile + "...");  
        }  
        ZipEntry zipEntry = new ZipEntry(base + inputFile.getName());  
        zipOutputStream.putNextEntry(zipEntry);  

        clearArrayBuffer();  
        while((bufferedInputStream.read(array, 0, BUFFERSIZE))!=-1){    
            zipOutputStream.write(array, 0, BUFFERSIZE);   
        }     
        bufferedInputStream.close();  
    }  

    /** 
     * @param inputFile 
     * @param zipOutputStream 
     * @param base 
     * @param isPrint 
     * @throws Exception 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description:壓縮文件夾 
     */  
    private static void inputDirectoryStream(File inputFile, ZipOutputStream zipOutputStream, String base,  boolean isPrint) throws Exception {  
        File[] files = inputFile.listFiles();  
        for (File file : files) {  
            if (file.isFile()) {  
                //這里實現遞歸調用  
                inputFileStream(file, zipOutputStream, base, isPrint);  
            } else {  
                String baseN = (base.length() == 0 ? "" : base + "/") + file.getName();  
                inputDirectoryStream(file, zipOutputStream, baseN, isPrint);  
            }  
        }  
    }  

    /** 
     * @param inputDir 
     * @param outputDir 
     * @param outputFileName 
     * @param isPrint 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description:壓縮文件OR文件夾 
     */  
    private static void zip(String inputDir, String outputDir, String outputFileName, boolean isPrint) {  
        try {  
            File inputFile = new File(inputDir);  
            if (!inputFile.exists()) {  
                System.out.println("Not found file " + inputDir);  
                return;  
            }  
            File outputFile = new File(outputDir);  
            if (!outputFile.exists()) {  
                outputFile.mkdirs();  
            }  

            openZipOutputStream(outputDir, outputFileName);  

            if (inputFile.isDirectory()) {  
                inputDirectoryStream(inputFile, zipOutputStream, "", isPrint);  
            } else {  
                inputFileStream(inputFile, zipOutputStream, "", isPrint);  
            }  

            closeZipOutputStream();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  

    }  

    /** 
     * @param inputFileName 
     * @param outputDir 
     * @param isPrint 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description: 解壓文件 
     */  
    @SuppressWarnings("rawtypes")  
    private static void unZip(String inputFileName, String outputDir, boolean isPrint) {  
        try {  
            File inputFile = new File(inputFileName);  
            if (!inputFile.exists()) {  
                System.out.println("Not found file " + inputFileName);  
                return;  
            }  
            File outputFile = new File(outputDir);  
            if (!outputFile.exists()) {  
                outputFile.mkdirs();  
            }  
            outputDir = outputDir.endsWith("[/|\\]") ? outputDir : outputDir + "/";  
            ZipFile zipFile = null;  
            try {  
                zipFile = new ZipFile(inputFileName);   
            } catch (ZipException e) {  
                System.out.println("File " + inputFileName + " isn't zip");  
                return;  
            }  
            Enumeration enu = zipFile.entries();    
            while(enu.hasMoreElements()){    
                ZipEntry zipEntry = (ZipEntry)enu.nextElement();    
                if(zipEntry.isDirectory()){    
                    new File(outputDir+zipEntry.getName()).mkdirs();    
                    continue;    
                }  
                BufferedInputStream bufferedInputStream = new BufferedInputStream(zipFile.getInputStream(zipEntry));    
                File file = new File(outputDir+zipEntry.getName());   
                if (isPrint) {  
                    System.out.println(file + "...");  
                }  
                File parent = file.getParentFile();    
                if(parent != null && !parent.exists()){    
                    parent.mkdirs();    
                }    
                FileOutputStream fileOutputStream = new FileOutputStream(file);    
                BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, BUFFERSIZE);    
                clearArrayBuffer();   
                while((bufferedInputStream.read(array, 0, BUFFERSIZE))!=-1){    
                    bufferedOutputStream.write(array, 0, BUFFERSIZE);   
                }    

                bufferedOutputStream.flush();    
                bufferedOutputStream.close();  
                fileOutputStream.close();  
                bufferedInputStream.close();    
            }   

        } catch (Exception e) {  
            e.printStackTrace();  
        }  

    }  

    /** 
     * @param fileName 
     * @param isZip 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description: 解壓OR壓縮文件,不顯示進度 
     */  
    public static void zipOrUnZip(String fileName, boolean isZip) {  
        zipOrUnZip(fileName, isZip, false);  
    }  

    /** 
     * @param fileName 
     * @param isZip 
     * @param isPrint 
     * @Date: 2013-8-8   
     * @Author: lulei   
     * @Description: 解壓OR壓縮文件,顯示進度 
     */  
    public static void zipOrUnZip(String fileName, boolean isZip, boolean isPrint) {  
        File inputFile = new File(fileName);  
        if (!inputFile.exists()) {  
            System.out.println("Not found file " + fileName);  
            return;  
        }  
        String outputDir = inputFile.getParent();  
        if (isZip) {  
            String outputFileName = inputFile.getName() + ".zip";  
            zip(fileName, outputDir, outputFileName, isPrint);  
        } else {  
            int i = inputFile.getName().indexOf(".");  
            if (i >= 0) {  
                outputDir += inputFile.getName().substring(0, i);  
                unZip(fileName, outputDir, isPrint);  
            } else {  
                System.out.println("File " + fileName + " isn't zip");  
                return;  
            }  
        }  
    }  

    public static void main(String[] args) {  
        // TODO Auto-generated method stub    
        Zip.zipOrUnZip("f:/outdoc", true, true);  
        Zip.zipOrUnZip("f:/outdoc.zip", false, true);  
    }  
}  </pre> 


最后可以直接調用zipOrUnZip()方法來實現壓縮和解壓功能即可

 本文由用戶 d6nd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!