📖

JavaでNIO.2を使いつつZIP圧縮&解凍

2024/08/13に公開

環境

JDK 17を使っています。たぶん、多少バージョンが違っていても同じように動くと思います。

圧縮

test1.txt・test2.txt・test3.txtを圧縮して、test.zipを作成します。

import文
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
コード本体
List<Path> targetFileList = List.of(
        Path.of("test1.txt"),
        Path.of("test2.txt"),
        Path.of("test3.txt")
);

Path zipFile = Path.of("test.zip");

try (OutputStream os = Files.newOutputStream(zipFile, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
     ZipOutputStream zos = new ZipOutputStream(os, StandardCharsets.UTF_8)) {
    for (Path targetFile : targetFileList) {
        ZipEntry zipEntry = new ZipEntry(targetFile.getFileName().toString());
        zos.putNextEntry(zipEntry);
        byte[] bytes = Files.readAllBytes(targetFile);
        zos.write(bytes);
        zos.closeEntry();
    }
} catch (IOException e) {
    // 適切に例外処理してください
}

解凍

圧縮の際に作成したZIPファイルを、resultフォルダに解答します。

import文
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
コード本体
Path zipPath = Path.of("test.zip");
Path dir = Path.of("result");

try (ZipFile zipFile = new ZipFile(zipPath.toFile(), StandardCharsets.UTF_8);
     Stream<? extends ZipEntry> stream = zipFile.stream()) {
    List<Path> uncompressedFileList = stream.filter(zipEntry -> zipEntry.isDirectory() == false)
            .map(zipEntry -> {
                try (InputStream is = zipFile.getInputStream(zipEntry)) {
                    byte[] bytes = is.readAllBytes();
                    Path uncompressedFile = Path.of(dir.toString(), zipEntry.getName());
                    Files.write(uncompressedFile, bytes, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
                    return uncompressedFile;
                } catch (IOException e) {
                    throw new UncheckedIOException(e);
                }
            })
            .toList();
} catch (IOException e) {
    // 適切に例外処理してください
}

参考にした記事

Discussion