FileDocCategorySizeDatePackage
UnZip.javaAPI DocExample2728Sat Nov 25 12:55:34 GMT 2000None

UnZip.java

import java.io.*;
import java.util.*;
import java.util.zip.*;

/**
 * UnZip -- print or unzip a JAR or PKZIP file using JDK1.1 java.util.zip.
 * Final command-line version: extracts files.
 * @author	Ian Darwin, Ian@DarwinSys.com
 * $Id: UnZip.java,v 1.4 2000/11/25 17:55:34 ian Exp $
 */
public class UnZip {
	/** Constants for mode listing or mode extracting. */
	public static final int LIST = 0, EXTRACT = 1;
	/** Whether we are extracting or just printing TOC */
	protected int mode = LIST;

	/** The ZipFile that is used to read an archive */
	protected ZipFile zippy;

	/** The buffer for reading/writing the ZipFile data */
	protected byte[] b;

	/** Simple main program, construct an UnZipper, process each
	 * .ZIP file from argv[] through that object.
	 */
	public static void main(String[] argv) {
		UnZip u = new UnZip();

		for (int i=0; i<argv.length; i++) {
			if ("-x".equals(argv[i])) {
				u.setMode(EXTRACT);
				continue;
			}
			String candidate = argv[i];
			// System.err.println("Trying path " + candidate);
			if (candidate.endsWith(".zip") ||
				candidate.endsWith(".jar"))
					u.unZip(candidate);
			else System.err.println("Not a zip file? " + candidate);
		}
		System.err.println("All done!");
	}

	/** Construct an UnZip object. Just allocate the buffer */
	UnZip() {
		b = new byte[8092];
	}

	/** Set the Mode (list, extract). */
	protected void setMode(int m) {
		if (m == LIST ||
		    m == EXTRACT)
			mode = m;
	}

	/** For a given Zip file, process each entry. */
	public void unZip(String fileName) {
		try {
			zippy = new ZipFile(fileName);
			Enumeration all = zippy.entries();
			while (all.hasMoreElements()) {
				getFile(((ZipEntry)(all.nextElement())));
			}
		} catch (IOException err) {
			System.err.println("IO Error: " + err);
			return;
		}
	}

	/** Process one file from the zip, given its name.
	 * Either print the name, or create the file on disk.
	 */
	protected void getFile(ZipEntry e) throws IOException {
		String zipName = e.getName();
		if (mode == EXTRACT) {
			// double-check that the file is in the zip
			// if a directory, mkdir it (remember to
			// create intervening subdirectories if needed!)
			if (zipName.endsWith("/")) {
				new File(zipName).mkdirs();
				return;
			}
			// Else must be a file; open the file for output
			System.err.println("Creating " + zipName);
			FileOutputStream os = new FileOutputStream(zipName);
			InputStream  is = zippy.getInputStream(e);
			int n = 0;
			while ((n = is.read(b)) >0)
				os.write(b, 0, n);
			is.close();
			os.close();
		} else
			// Not extracting, just list
			if (e.isDirectory()) {
				System.out.println("Directory " + zipName);
			} else {
				System.out.println("File " + zipName);
			}
	}
}