サンプル
ZipHelper.java
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; public class ZipHelper { public static void unzip(String inputZipFile) { ZipHelper.unzip(inputZipFile, null); } public static void unzip(String inputZipFile, String outputFile) { try { File zipFile = new File(inputZipFile); // 出力先ディレクトリを作成 File outputDirectry = ZipHelper.createOutputDirectry(zipFile, outputFile); ZipHelper.unzip(zipFile, outputDirectry); } catch (Exception ex) { ex.printStackTrace(); } } /** * 出力先ディレクトリを作成 * @param zipFile 解凍対象のZip File * @param outputFile 出力先ディレクトリ * @return 出力先ディレクトリ * @throws FileNotFoundException */ private static File createOutputDirectry(final File zipFile, final String outputFile) throws FileNotFoundException { File outputDirectry; if (outputFile != null) { outputDirectry = new File(outputFile); } else { // 出力先ディレクトリが指定されない場合、 対象のZipファイルと同名のディレクトリを作成 String fileName = zipFile.getName(); int indexOfExtention = fileName.lastIndexOf("."); String baseDirectryName = fileName.substring(0, indexOfExtention); outputDirectry = new File(zipFile.getParent(), baseDirectryName); } if (!outputDirectry.exists()) { // 出力先ディレクトリが存在しない場合、作成 if (!outputDirectry.mkdir()) { throw new FileNotFoundException(outputDirectry + "の生成に失敗しました。"); } } return outputDirectry; } private static void unzip(File zipFile, File baseDirectry) { try (ZipFile zip = new ZipFile(zipFile)) { Enumeration<? extends ZipEntry> entries = zip.entries(); while (entries.hasMoreElements()) { ZipEntry zipEntry = entries.nextElement(); File outFile = new File(baseDirectry, zipEntry.getName()); if (zipEntry.isDirectory()) { // ZipEntry がディレクトリの場合はディレクトリを作成。 outFile.mkdirs(); } else { try (InputStream inputStream = zip.getInputStream(zipEntry); BufferedInputStream bufferedInputStream = new BufferedInputStream( inputStream);) { if (!outFile.getParentFile().exists()) { // 出力先ファイルの保存先ディレクトリが存在しない場合は、 // ディレクトリを作成しておく。 outFile.getParentFile().mkdirs(); } try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream( new FileOutputStream(outFile));) { // 入力ストリームから読み込み、出力ストリームへ書き込む。 ZipHelper.writeStream(bufferedInputStream, bufferedOutputStream); } } } } } catch (ZipException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static void writeStream(InputStream inputStream, OutputStream outputStream) throws IOException { int availableByteNumber; while ((availableByteNumber = inputStream.available()) > 0) { byte[] buffers = new byte[availableByteNumber]; int readByteNumber = inputStream.read(buffers); if (readByteNumber < 0) { break; } outputStream.write(buffers, 0, readByteNumber); } } }
Main.java
* 使用者* C:\\tempにフォルダ「Sample」と「test」にそれぞれ「C:\\temp\\Sample.zip」が解凍される
public class Main { public static void main(String[] args) { ZipHelper.unzip("C:\\temp\\Sample.zip"); ZipHelper.unzip("C:\\temp\\Sample.zip", "C:\\temp\\test"); } }