changeset 383:b076c9e9fdfd

Added method to extract zip archives to a specified directory. artifacts/trunk@4293 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Wed, 25 Apr 2012 07:47:56 +0000
parents a94bc2491b41
children 823752e3d392
files ChangeLog artifacts-common/src/main/java/de/intevation/artifacts/common/utils/FileTools.java
diffstat 2 files changed, 59 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Apr 19 18:20:55 2012 +0000
+++ b/ChangeLog	Wed Apr 25 07:47:56 2012 +0000
@@ -1,3 +1,8 @@
+2012-04-25  Raimund Renkert <raimund.renkert@intevation.de>
+
+	* artifacts-common/src/main/java/de/intevation/artifacts/common/utils/FileTools.java:
+	  Added method to extract zip archives to a specified directory.
+
 2012-04-19	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
 
 	* artifacts-common/src/main/java/de/intevation/artifacts/common/utils/XSLTransformer.java:
--- a/artifacts-common/src/main/java/de/intevation/artifacts/common/utils/FileTools.java	Thu Apr 19 18:20:55 2012 +0000
+++ b/artifacts-common/src/main/java/de/intevation/artifacts/common/utils/FileTools.java	Wed Apr 25 07:47:56 2012 +0000
@@ -14,6 +14,7 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
+import java.io.BufferedOutputStream;
 import java.nio.channels.FileChannel;
 
 import java.util.Deque;
@@ -22,6 +23,8 @@
 import java.util.Set;
 import java.util.HashSet;
 import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.zip.ZipFile;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -347,6 +350,57 @@
         out.finish();
     }
 
+
+    public static void extractArchive(File archive, File destDir)
+    throws IOException {
+        if (!destDir.exists()) {
+            destDir.mkdir();
+        }
+
+        ZipFile zipFile = new ZipFile(archive);
+        Enumeration entries = zipFile.entries();
+
+        byte[] buffer = new byte[16384];
+        int len;
+        while (entries.hasMoreElements()) {
+            ZipEntry entry = (ZipEntry) entries.nextElement();
+
+            String entryFileName = entry.getName();
+
+            File dir = dir = buildDirectoryHierarchyFor(entryFileName, destDir);
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+
+            if (!entry.isDirectory()) {
+                BufferedOutputStream bos = new BufferedOutputStream(
+                        new FileOutputStream(new File(destDir, entryFileName)));
+
+                BufferedInputStream bis = new BufferedInputStream(zipFile
+                        .getInputStream(entry));
+
+                while ((len = bis.read(buffer)) > 0) {
+                    bos.write(buffer, 0, len);
+                }
+
+                bos.flush();
+                bos.close();
+                bis.close();
+            }
+        }
+        zipFile.close();
+    }
+
+    private static File buildDirectoryHierarchyFor(
+        String entryName,
+        File destDir)
+    {
+        int lastIndex = entryName.lastIndexOf('/');
+        String entryFileName = entryName.substring(lastIndex + 1);
+        String internalPathToEntry = entryName.substring(0, lastIndex + 1);
+        return new File(destDir, internalPathToEntry);
+    }
+
     /**
      * A class representing a directory with a prefix.
      */

http://dive4elements.wald.intevation.org