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を取得する利点がないが、テキストファイルを読むときはこちらのほうがいいだろう。