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、ボチボチ細かく便利になっていていいですね。