Javaでの圧縮・解凍処理の実装方法

1. ZIP圧縮の実装

Java標準ライブラリのjava.util.zipパッケージを使用して、複数ファイルをZIP形式で圧縮する処理を実装できます。以下のサンプルコードでは、カスタムバッファサイズと拡張for文を使用した実装例を示します:


import java.io.*;
import java.util.zip.*;

public class ZipArchiver {
    public static void main(String[] args) {
        String[] sourceFiles = {"document.txt", "data.csv", "image.png"};
        String outputZip = "archive.zip";
        
        try (FileOutputStream fos = new FileOutputStream(outputZip);
             ZipOutputStream zos = new ZipOutputStream(fos)) {
            
            byte[] buffer = new byte[2048];
            
            for (String filePath : sourceFiles) {
                File fileToZip = new File(filePath);
                try (FileInputStream fis = new FileInputStream(fileToZip)) {
                    zos.putNextEntry(new ZipEntry(fileToZip.getName()));
                    
                    int bytesRead;
                    while ((bytesRead = fis.read(buffer)) > 0) {
                        zos.write(buffer, 0, bytesRead);
                    }
                    
                    zos.closeEntry();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. ZIP解凍の実装

ZIPファイルからの解凍処理はZipInputStreamを使用して実現可能です。以下のコードでは、階層構造を保持したファイル展開を実装しています:


import java.io.*;
import java.util.zip.*;

public class ZipExtractor {
    public static void main(String[] args) {
        String inputZip = "archive.zip";
        String targetDir = "extracted/";
        
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(inputZip))) {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                File outputFile = new File(targetDir + entry.getName());
                
                if (entry.isDirectory()) {
                    outputFile.mkdirs();
                    continue;
                }
                
                outputFile.getParentFile().mkdirs();
                
                try (FileOutputStream fos = new FileOutputStream(outputFile)) {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    
                    while ((bytesRead = zis.read(buffer)) > 0) {
                        fos.write(buffer, 0, bytesRead);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 第三者ライブラリの活用

複雑な圧縮形式にはApache Commons Compressライブラリが有効です。以下はtar.gz形式での圧縮例:


import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;

// Maven依存:org.apache.commons:commons-compress

public class TarGzArchiver {
    public static void main(String[] args) throws Exception {
        try (FileOutputStream fos = new FileOutputStream("data.tar.gz");
             GzipCompressorOutputStream gzipOut = new GzipCompressorOutputStream(fos);
             TarArchiveOutputStream tarOut = new TarArchiveOutputStream(gzipOut)) {
            
            File[] sourceFiles = {new File("file1.txt"), new File("file2.txt")};
            
            for (File file : sourceFiles) {
                TarArchiveEntry entry = new TarArchiveEntry(file, file.getName());
                tarOut.putArchiveEntry(entry);
                
                try (FileInputStream fis = new FileInputStream(file)) {
                    byte[] buffer = new byte[8192];
                    int count;
                    while ((count = fis.read(buffer)) > 0) {
                        tarOut.write(buffer, 0, count);
                    }
                }
                
                tarOut.closeArchiveEntry();
            }
        }
    }
}

タグ: Java ZIP圧縮 Apache Commons Compress TarGZ ファイル処理

5月19日 12:33 投稿