자바 Zip 파일 폴더 예제

오늘은 자바 zip 파일 예제를 살펴보겠습니다. 또한 자바 프로그램을 사용하여 폴더를 압축하고 zip 파일을 만들 것입니다.

Java ZIP

java.util.zip.ZipOutputStream은 파일을 ZIP 형식으로 압축하는 데 사용할 수 있습니다. zip 파일에는 여러 항목이 포함될 수 있으므로 ZipOutputStream은 java.util.zip.ZipEntry를 사용하여 zip 파일 항목을 나타냅니다.

Java ZIP 파일

단일 파일에 대한 zip 아카이브를 만드는 것은 매우 쉽습니다. 대상 파일의 FileOutputStream 개체에서 ZipOutputStream 개체를 만들어야 합니다. 그런 다음 새 ZipEntry를 ZipOutputStream에 추가하고 FileInputStream을 사용하여 소스 파일을 ZipOutputStream 개체로 읽습니다. 쓰기가 완료되면 ZipEntry를 닫고 모든 리소스를 해제해야 합니다.

Java Zip 폴더

디렉터리를 압축하는 것은 약간 까다로운데, 먼저 파일 목록을 절대 경로로 가져와야 합니다. 그런 다음 각 파일을 개별적으로 처리해야 합니다. 각 파일에 대해 ZipEntry를 추가하고 FileInputStream을 사용하여 해당 파일에 대한 ZipEntry에 소스 파일의 내용을 읽어야 합니다.

Java Zip 예제

여기는 자바 프로그램에서 어떻게 단일 파일 또는 폴더를 압축하는지를 보여주는 부분입니다.

package com.journaldev.files;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFiles {
    
    List filesListInDir = new ArrayList();

    public static void main(String[] args) {
        File file = new File("/Users/pankaj/sitemap.xml");
        String zipFileName = "/Users/pankaj/sitemap.zip";
        
        File dir = new File("/Users/pankaj/tmp");
        String zipDirName = "/Users/pankaj/tmp.zip";
        
        zipSingleFile(file, zipFileName);
        
        ZipFiles zipFiles = new ZipFiles();
        zipFiles.zipDirectory(dir, zipDirName);
    }

    /**
     * This method zips the directory
     * @param dir
     * @param zipDirName
     */
    private void zipDirectory(File dir, String zipDirName) {
        try {
            populateFilesList(dir);
            //이제 파일을 하나씩 압축합니다
            //zip 파일에 쓰기 위해 ZipOutputStream 생성
            FileOutputStream fos = new FileOutputStream(zipDirName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            for(String filePath : filesListInDir){
                System.out.println("Zipping "+filePath);
                //ZipEntry에 대해 상대 파일 경로만 유지해야 하므로 절대 경로에 대해 substring을 사용했습니다
                ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
                zos.putNextEntry(ze);
                //파일 읽고 ZipOutputStream에 쓰기
                FileInputStream fis = new FileInputStream(filePath);
                byte[] buffer = new byte[1024];
                int len;
                while ((len = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, len);
                }
                zos.closeEntry();
                fis.close();
            }
            zos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * This method populates all the files in a directory to a List
     * @param dir
     * @throws IOException
     */
    private void populateFilesList(File dir) throws IOException {
        File[] files = dir.listFiles();
        for(File file : files){
            if(file.isFile()) filesListInDir.add(file.getAbsolutePath());
            else populateFilesList(file);
        }
    }

    /**
     * This method compresses the single file to zip format
     * @param file
     * @param zipFileName
     */
    private static void zipSingleFile(File file, String zipFileName) {
        try {
            //zip 파일에 쓰기 위해 ZipOutputStream 생성
            FileOutputStream fos = new FileOutputStream(zipFileName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            //ZipOutputStream에 새 Zip Entry 추가
            ZipEntry ze = new ZipEntry(file.getName());
            zos.putNextEntry(ze);
            //파일 읽고 ZipOutputStream에 쓰기
            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
            
            //zip 파일에 쓰기 위해 zip entry 닫기
            zos.closeEntry();
            //리소스 닫기
            zos.close();
            fis.close();
            fos.close();
            System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
            
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

위의 자바 zip 예제 프로그램의 출력은 다음과 같습니다:

/Users/pankaj/sitemap.xml is zipped to /Users/pankaj/sitemap.zip
Zipping /Users/pankaj/tmp/.DS_Store
Zipping /Users/pankaj/tmp/data/data.dat
Zipping /Users/pankaj/tmp/data/data.xml
Zipping /Users/pankaj/tmp/data/xmls/project.xml
Zipping /Users/pankaj/tmp/data/xmls/web.xml
Zipping /Users/pankaj/tmp/data.Xml
Zipping /Users/pankaj/tmp/DB.xml
Zipping /Users/pankaj/tmp/item.XML
Zipping /Users/pankaj/tmp/item.xsd
Zipping /Users/pankaj/tmp/ms/data.txt
Zipping /Users/pankaj/tmp/ms/project.doc

위와 같이 디렉터리에서 파일을 zip으로 기록할 때는 절대 경로를 출력하고 있습니다. 그러나 zip entry를 추가할 때는 디렉터리에서의 상대 경로를 사용하여 압축을 풀 때 동일한 디렉터리 구조가 생성되도록 합니다. 이로서 Java zip 예제에 대한 설명이 모두입니다.

Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example