Java APIによるzip再帰圧縮フォルダおよび解凍

6512 ワード

一、概説
この記事では、ファイルをzip圧縮する方法と、zipパッケージを解凍する方法について説明します.これらはすべてJavaが提供するコアライブラリjava.util.zipを使用して実現されます.
二、圧縮ファイル
まず、単一のファイルを圧縮する簡単な例を学びます.test 1.txtというファイルをCompressed.zipというzipファイルに圧縮します.
public class ZipFile {
    public static void main(String[] args) throws IOException {
       
        //     
        FileOutputStream fos = new FileOutputStream("src/main/resources/compressed.zip");
        ZipOutputStream zipOut = new ZipOutputStream(fos);

        //     
        File fileToZip = new File("src/main/resources/test1.txt");
        FileInputStream fis = new FileInputStream(fileToZip);
        
        //         
        ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
        zipOut.putNextEntry(zipEntry);
        byte[] bytes = new byte[1024];
        int length;
        while((length = fis.read(bytes)) >= 0) {
            zipOut.write(bytes, 0, length);
        }
        zipOut.close();
        fis.close();
        fos.close();
    }
}

三、複数のファイルを圧縮する
次に、複数のファイルをzipファイルに圧縮する方法を見てみましょう.test 1.txtとtest 2.txtをmultiCompressed.zipに圧縮します.
public class ZipMultipleFiles {
    public static void main(String[] args) throws IOException {
        List srcFiles = Arrays.asList("src/main/resources/test1.txt", "src/main/resources/test2.txt");
        FileOutputStream fos = new FileOutputStream("src/main/resources/multiCompressed.zip");
        ZipOutputStream zipOut = new ZipOutputStream(fos);
        //           
        for (String srcFile : srcFiles) {
            File fileToZip = new File(srcFile);
            FileInputStream fis = new FileInputStream(fileToZip);
            ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
            zipOut.putNextEntry(zipEntry);
 
            byte[] bytes = new byte[1024];
            int length;
            while((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }
            fis.close();
        }
        zipOut.close();
        fos.close();
    }
}

四、圧縮ディレクトリ
次の例では、zipTestディレクトリとそのディレクトリの下にある再帰サブディレクトリファイルをdirCompressed.zipに圧縮します.
public class ZipDirectory {
    public static void main(String[] args) throws IOException, FileNotFoundException {
        //       
        String sourceFile = "src/main/resources/zipTest"; 
        //      ,    
        FileOutputStream fos = new FileOutputStream("src/main/resources/dirCompressed.zip");
        ZipOutputStream zipOut = new ZipOutputStream(fos);
        File fileToZip = new File(sourceFile);
        //       
        zipFile(fileToZip, fileToZip.getName(), zipOut);
        //     
        zipOut.close();
        fos.close();
    }
     

    /**
     *  fileToZip               zip   
     * @param fileToZip         ,      ,      
     * @param fileName fileToZip        
     * @param zipOut        
     * @throws IOException
     */
    private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
        //        
        if (fileToZip.isHidden()) {
            return;
        }
        //              
        if (fileToZip.isDirectory()) {
            if (fileName.endsWith("/")) {
                //       “/”  ,           zipOut     
                zipOut.putNextEntry(new ZipEntry(fileName));
                zipOut.closeEntry();
            } else {
                //        “/”  ,        “/”         zipOut     
                zipOut.putNextEntry(new ZipEntry(fileName + "/"));
                zipOut.closeEntry();
            }
            //        ,     zipFile
            File[] children = fileToZip.listFiles();
            for (File childFile : children) {
                zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
            }
            //            ,  ZipEntry     
            return;
        }
        //     fileToZip       ,     ,                
        FileInputStream fis = new FileInputStream(fileToZip);
        ZipEntry zipEntry = new ZipEntry(fileName);
        zipOut.putNextEntry(zipEntry);
        byte[] bytes = new byte[1024];
        int length;
        while ((length = fis.read(bytes)) >= 0) {
            zipOut.write(bytes, 0, length);
        }
        fis.close();
    }
}
  • サブディレクトリおよびそのサブディレクトリファイルを圧縮するには、
  • を再帰的に巡回する必要がある.
  • ディレクトリが検索されるたびに、その名前に「/」を付け、圧縮されたディレクトリ構造を維持するためにZipEntryで圧縮パッケージに保存します.
  • ファイルが検索されるたびに、圧縮パケット内の
  • にバイトコードで圧縮する.
    五、zip圧縮パッケージを解凍する
    次に、zip圧縮パッケージの解凍を例に挙げて説明します.この例では、compressed.zipをunzipTestという新しいフォルダに解凍します.
    public class UnzipFile {
        public static void main(String[] args) throws IOException {
            //        
            String fileZip = "src/main/resources/unzipTest/compressed.zip";
            //       
            File destDir = new File("src/main/resources/unzipTest");
    
            byte[] buffer = new byte[1024];
            ZipInputStream zis = new ZipInputStream(new FileInputStream(fileZip));
            //       entry,     
            ZipEntry zipEntry = zis.getNextEntry();
            while (zipEntry != null) {
                File newFile = newFile(destDir, zipEntry);
                FileOutputStream fos = new FileOutputStream(newFile);
                int len;
                while ((len = zis.read(buffer)) > 0) {
                    fos.write(buffer, 0, len);
                }
                fos.close();
                //      entry,      
                zipEntry = zis.getNextEntry();
            }
            zis.closeEntry();
            zis.close();
        }
        //        ,      
        public static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException {
            File destFile = new File(destinationDir, zipEntry.getName());
    
            String destDirPath = destinationDir.getCanonicalPath();
            String destFilePath = destFile.getCanonicalPath();
    
            if (!destFilePath.startsWith(destDirPath + File.separator)) {
                throw new IOException("            : " + zipEntry.getName());
            }
    
            return destFile;
        }
    }
    

    私のブログに注目してください.中にはたくさんの逸品が集まっています.
  • 本文は転載して出典を明記します(必ず接続を持っていなければならなくて、文字だけを回転することができません):アルファベットの兄のブログ.

  • あなたに役に立つと思ったら、いいね、分かち合ってください.あなたの支持は私の尽きない創作の原動力です!のまた、筆者は最近、以下のような逸品を出力しており、ご注目をお待ちしております.
  • 『手を触ってSpring Boot 2.0を教える』
  • 『Spring Security-JWT-OAuth 2一本通』
  • 『実戦前後端分離RBAC権限管理システム』
  • 『実戦SpringCloudマイクロサービス青銅から王者へ』
  • 「VUE深入浅出シリーズ」