/* * Copyright 2012 Phil Pratt-Szeliga and other contributors * http://chirrup.org/ * * See the file LICENSE for copying permission. */ package org.trifort.rootbeer.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class JarToFolder { private StringDelegate m_StringDelegate; public JarToFolder(){ m_StringDelegate = null; } public JarToFolder(StringDelegate del){ m_StringDelegate = del; } public void writeJar(String jar, String folder) throws Exception { folder = normalizeFolder(folder); ZipInputStream zin = new ZipInputStream(new FileInputStream(jar)); while(true){ ZipEntry entry = zin.getNextEntry(); if(entry == null) break; if(shouldWrite(entry) == false) continue; String name = entry.getName(); if(entry.isDirectory() == false && m_StringDelegate != null && name.endsWith(".class")){ m_StringDelegate.call(name); } String s = File.separator; if(s.equals("\\")){ name = name.replace("/", "\\"); } String outname = folder+name; JarEntryHelp.mkdir(outname); if(entry.isDirectory() == false){ OutputStream fout = new FileOutputStream(outname); write(zin, fout); fout.flush(); fout.close(); } } zin.close(); } protected boolean shouldWrite(ZipEntry entry){ return true; } private String normalizeFolder(String folder){ String sep = File.separator; if(folder.endsWith(sep) == false) folder += sep; return folder; } private void write(ZipInputStream zin, OutputStream fout) throws Exception { while(true){ byte[] buffer = new byte[4096]; int len = zin.read(buffer); if(len == -1) break; fout.write(buffer, 0, len); } } }