Java7触ってみる(1) ZipFS

package org.hogel.ArchiveTest;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

public class ZipTest {
    @Test
    public void zipfsのテスト() throws Exception {
        URI zipfile = URI.create("jar:file:/tmp/zipfs-test.zip");
        Map<String, String> env = new HashMap<>();

        // ZIPファイルを新規作成、ZIPエントリ名のエンコーディングはMS932(Shift-JIS)に
        env.put("create", "true");
        env.put("encoding", "MS932");
        try (FileSystem zipfs = FileSystems.newFileSystem(zipfile, env)) {
            // ほげ.txtファイルをZIPファイル内に作成
            Files.write(zipfs.getPath("ほげ.txt"), "ほげ".getBytes("MS932"), StandardOpenOption.CREATE);
        }

        // ZIPエントリほげ.txtというエントリ名がMS932(Shift−JIS)であることを確認
        byte[] zipdata = Files.readAllBytes(Paths.get("/tmp/zipfs-test.zip"));
        assertThat(new String(zipdata, "MS932").contains("ほげ.txt"), is(true));

        // 既存のZIPファイルの読み込みテスト
        env.put("create", "false");
        try (FileSystem zipfs = FileSystems.newFileSystem(zipfile, env)) {
            // ZIPファイル内のほげ.txtファイルを確認
            assertThat(new String(Files.readAllBytes(zipfs.getPath("ほげ.txt")), "MS932"), is("ほげ"));
        }
    }
}

ZIPへの追記、パス名のエンコーディング指定とかが標準ライブラリでできる。Java6でやりたければTrueZIPかな。まあJava7、ボチボチ細かく便利になっていていいですね。

test