JavaでZipを展開して書き出すプログラム。以前も作ったことがあったような気がします。java.util.zipパッケージはパスワードつきの、encrypt, decryptに対応していないようなので、winzipaes – Encrypt+Decrypt files in WinZip AES format via java – Google Project Hosting: http://code.google.com/p/winzipaes/とかを使った方がいいのかもしれません。
package org.sssg.soft.sample.zip;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
public class Tool {
public static void main(String[] args) {
Tool app = new Tool();
if (args.length <= 0) {
System.out.println("help: java org.sssg.soft.sample.zip.Tool <fileName>");
return;
}
String fileName = args[0];
try {
File file = new File(fileName);
app.unzip(file);
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
}
}
private String getBaseDirName(String s) {
int exindex = s.lastIndexOf(".");
return s.substring(0, exindex);
}
private File baseDir = null;
private ZipFile zipFile = null;
public void unzip(File file) throws ZipException, IOException {
baseDir = new File(getBaseDirName(file.getAbsolutePath()));
if (!baseDir.exists()) {
baseDir.mkdir();
}
try {
zipFile = new ZipFile(file);
for (Enumeration<? extends ZipEntry> entries = zipFile.entries(); entries
.hasMoreElements();) {
ZipEntry ze = entries.nextElement();
execUnit(ze);
}
} finally {
if (zipFile != null) {
zipFile.close();
}
}
}
private void execUnit(ZipEntry ze) throws IOException {
File outFile = new File(baseDir, ze.getName());
if (ze.isDirectory()) {
outFile.mkdirs();
} else {
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(outFile));
execFile(ze, bos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (bos != null) {
bos.close();
}
}
}
}
private void execFile(ZipEntry ze, BufferedOutputStream bos) throws IOException {
BufferedInputStream bis = null;
try {
InputStream is = zipFile.getInputStream(ze);
bis = new BufferedInputStream(is);
int length;
while ((length = bis.available()) > 0) {
byte[] bs = new byte[length];
bis.read(bs);
bos.write(bs);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
bis.close();
}
}
}
}