KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > util > ZipBuilder


1 /*
2  * All content copyright (c) 2003-2007 Terracotta, Inc., except as may otherwise be noted in a separate copyright
3  * notice. All rights reserved.
4  */

5 package com.tc.util;
6
7 import org.apache.commons.io.CopyUtils;
8
9 import java.io.BufferedInputStream JavaDoc;
10 import java.io.BufferedOutputStream JavaDoc;
11 import java.io.File JavaDoc;
12 import java.io.FileInputStream JavaDoc;
13 import java.io.FileOutputStream JavaDoc;
14 import java.io.IOException JavaDoc;
15 import java.io.InputStream JavaDoc;
16 import java.util.HashSet JavaDoc;
17 import java.util.zip.CRC32 JavaDoc;
18 import java.util.zip.ZipEntry JavaDoc;
19 import java.util.zip.ZipInputStream JavaDoc;
20 import java.util.zip.ZipOutputStream JavaDoc;
21
22 /**
23  * NOT THREAD SAFE
24  */

25 public class ZipBuilder implements ArchiveBuilder {
26
27   private final CRC32 JavaDoc crc32 = new CRC32 JavaDoc();
28   private final ZipOutputStream JavaDoc zout;
29   private final HashSet JavaDoc dirSet = new HashSet JavaDoc();
30   private final HashSet JavaDoc entrySet = new HashSet JavaDoc();
31
32   public ZipBuilder(File JavaDoc archiveFile, boolean useCompression) throws IOException JavaDoc {
33     zout = getArchiveOutputStream(archiveFile);
34     if (useCompression) {
35       zout.setMethod(ZipEntry.DEFLATED);
36       zout.setLevel(9);
37     } else {
38       zout.setMethod(ZipEntry.STORED);
39       zout.setLevel(0);
40     }
41   }
42
43   public final void putTraverseDirectory(File JavaDoc dir, String JavaDoc dirName) throws IOException JavaDoc {
44     if (!dir.isDirectory()) throw new IOException JavaDoc("Unexpected Exception: " + dir + "\nis not a directory");
45     putDirEntry(dirName);
46     String JavaDoc[] files = dir.list();
47     for (int i = 0; i < files.length; i++) {
48       File JavaDoc file = new File JavaDoc(dir + File.separator + files[i]);
49       if (file.isDirectory()) {
50         putTraverseDirectory(file, dirName + File.separator + file.getName());
51         continue;
52       }
53       putEntry(dirName + File.separator + files[i], readFile(file));
54     }
55   }
56
57   public final void putDirEntry(String JavaDoc file) throws IOException JavaDoc {
58     if (dirSet.contains(file)) return;
59     dirSet.add(file);
60     String JavaDoc dirEntry = archivePath(file) + "/";
61     ZipEntry JavaDoc entry = createEntry(dirEntry);
62     entry.setSize(0);
63     entry.setCrc(0);
64     zout.putNextEntry(entry);
65     System.out.println(dirEntry);
66   }
67
68   public final void putEntry(String JavaDoc file, byte[] bytes) throws IOException JavaDoc {
69     if (entrySet.contains(file.toString())) return;
70     entrySet.add(file.toString());
71     String JavaDoc fileEntry = archivePath(file);
72     ZipEntry JavaDoc entry = createEntry(fileEntry);
73     entry.setSize(bytes.length);
74     entry.setCrc(getCrc32(bytes));
75     zout.putNextEntry(entry);
76     zout.write(bytes, 0, bytes.length);
77     System.out.println(fileEntry);
78   }
79
80   public final void finish() throws IOException JavaDoc {
81     zout.close();
82   }
83
84   public final byte[] readFile(File JavaDoc file) throws IOException JavaDoc {
85     BufferedInputStream JavaDoc in = new BufferedInputStream JavaDoc(new FileInputStream JavaDoc(file));
86     byte[] bytes = new byte[in.available()];
87     in.read(bytes);
88     in.close();
89     return bytes;
90   }
91
92   protected ZipEntry JavaDoc createEntry(String JavaDoc name) {
93     return new ZipEntry JavaDoc(name);
94   }
95
96   protected ZipOutputStream JavaDoc getArchiveOutputStream(File JavaDoc archiveFile) throws IOException JavaDoc {
97     if (zout != null) throw new IllegalStateException JavaDoc("ArchiveOutputStream has already been instantiated.");
98     return new ZipOutputStream JavaDoc(new BufferedOutputStream JavaDoc(new FileOutputStream JavaDoc(archiveFile)));
99   }
100
101   private long getCrc32(byte[] bytes) {
102     crc32.update(bytes);
103     long checksum = crc32.getValue();
104     crc32.reset();
105     return checksum;
106   }
107
108   private String JavaDoc archivePath(String JavaDoc file) {
109     if (File.separator.equals("/")) return file;
110     return file.replaceAll("\\\\", "/");
111   }
112
113   public static void unzip(InputStream JavaDoc archive, File JavaDoc destDir) throws IOException JavaDoc {
114     ZipInputStream JavaDoc zis = new ZipInputStream JavaDoc(archive);
115     ZipEntry JavaDoc entry;
116     while ((entry = zis.getNextEntry()) != null) {
117       File JavaDoc file = new File JavaDoc(destDir, entry.getName());
118       if (!entry.getName().endsWith("/")) {
119         CopyUtils.copy(zis, new FileOutputStream JavaDoc(file));
120       } else {
121         file.mkdirs();
122       }
123       zis.closeEntry();
124     }
125   }
126 }
127
Popular Tags