プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

ZIP圧縮でもしてみる -part2 ZIPファイルの読み込み -

 今回は読み込み。読みは書き込みの反対なので、ZipInputStreamとZipEntryをつかって読み込むことができる。しかし読み込みは、ZipOutputStreamと同様、ZInputStream#read(bute[], int, int)のみなので、Zipアーカイブ内にあるテキストファイルを読みたいとき不便である。そのため、InputStreamを取得できる、ZipFileとZipEntryを使った方法を紹介しよう。

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

public class Main {
    public static void main(String[] args) throws Exception {
        byte[] buf = new byte[1024];
        ZipFile zf = new ZipFile("hoge.zip"); // (1)
        
        Enumeration e = zf.entries();
        while( e.hasMoreElements() ) { // (2)
            ZipEntry entry = (ZipEntry) e.nextElement();
            String entryname = entry.getName();
            String filename  = entryname.split("/")[entryname.split("/").length - 1];
            InputStream in   = zf.getInputStream(entry); // (3)
            
            int size = -1;
            FileOutputStream out = new FileOutputStream(filename);
            while( (size = in.read(buf)) != -1 )
                out.write(buf, 0, size);
            out.flush();
            out.close();
            in.close();
        }
        
        zf.close();
    }
}

 まず、ZipFileのコンストラクタで開くファイルを指定する (1)。ZipFile#entries()でZipEntryのEnumerationを取得できるので、いつものようにhasMoreElements()とnextElement()で次々に要素を取得していく (2)。取得したZipEntryをZipFile#getInputStream()に渡すことによって、InputStreamを取得できる (3)。このInputStreamをInputStreamReaderのコンストラクタに渡せば、直接テキストファイルを読むことができる。今回は、単純に解凍したデータをファイルにはいているだけなので、InputStreamを取得する利点がないが、テキストファイルを読むときはこちらのほうがいいだろう。