package javacodebook.io.readzip; import java.io.*; import java.util.*; import java.util.zip.*; public class ZipReader { private ZipFile zipFile; private File targetDir; public ZipReader(File f, File targetDir) throws IOException { zipFile = new ZipFile(f); this.targetDir = targetDir; } public void showZipEntries(boolean unzip) throws IOException { Enumeration entries = zipFile.entries(); while(entries.hasMoreElements()) { ZipEntry entry = (ZipEntry)entries.nextElement(); if(unzip) extractFile(entry); else System.out.println(entry.getName()); } } //Einen Eintrag aus dem Zip-Archiv extrahieren und mit entsprechenden //Unterverzeichnissen in das Zielverzeichnis schreiben private void extractFile(ZipEntry entry) throws IOException { //Neues File relativ zum Zielverzeichnis anlegen File newFile = new File(targetDir, entry.getName()); if(entry.isDirectory()) { //Zielverzeichnis && alle übergeordneten Verzeichnisse anlegen newFile.mkdirs(); } else { //Der Eintrag im Zip-Archiv wird über einen Stream ausgelesen FileOutputStream out = new FileOutputStream(newFile); InputStream in = zipFile.getInputStream(entry); int bytesRead = 0; byte[] buffer = new byte[8192]; while((bytesRead = in.read(buffer)) > 0) out.write(buffer, 0, bytesRead); in.close(); out.close(); } } public static void main(String[] args) throws Exception { if(args.length < 1) printUsage(); File f = new File(args[0]); boolean unzip = false; File targetDir = null; if(args.length == 2 && "-x".equals(args[1])) { unzip = true; System.out.println("Zielverzeichnis: "); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); targetDir = new File(in.readLine()); if(!targetDir.isDirectory()) { System.out.println("Ziel ist kein Verzeichnis"); System.exit(0); } System.out.println("Archiv wird nach " + targetDir.getAbsolutePath() + " entpackt"); } ZipReader zipReader = new ZipReader(f, targetDir); zipReader.showZipEntries(unzip); } private static void printUsage() { System.out.println("Aufruf: java javacodebook.io.readzip.ZipReader Dateiname [-x]"); System.exit(0); } }