Tieni... è una classe che controlla una cartella e se vengono aggiunti file zip li estrae... dovrebbe fare al caso tuo...

codice:
import java.io.*;
import java.util.*;
import java.util.zip.*;
import java.text.*;

public class UnzipFiles {
	
	
	// DICHIARAZIONI VARIABILI E OGGETTI
	private Vector orig;
	private Vector mod;
	private String pathFolderZip;
	private String pathFolderUnzip;
	private String pathMoveFileZip;
	private int timeControl;
	private LogFile pathLog;
	private int esecuzioneProcedura = 1;
	
	
	// ESECUZIONE PRINCIPALE DEL PROGRAMMA
	public static void main(String[] args) {
		final UnzipFiles scompattaFiles = new UnzipFiles();
		scompattaFiles.init();
		Runnable r = new Runnable() {
			public void run () {
				Thread t = Thread.currentThread();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				scompattaFiles.monitorFolder();
			}
		};
		(new Thread (r)).start();
	}
	
	
	// INIZIALIZZO VARIABILI
	public void init(){
		// LETTURA DA FILE DI CONFIGURAZIONE
		try{
			pathLog = new LogFile("TraceUnzip.log");
			Properties props=new Properties();
			props.load( new FileInputStream(new File("AutoUnzip.cfg")));
			pathFolderZip = props.getProperty("pathFolderZip");
			pathFolderUnzip = props.getProperty("pathFolderUnzip");
			pathMoveFileZip = props.getProperty("pathMoveFileZip");
			timeControl = Integer.parseInt(props.getProperty("timeControl"));
			// CARICO IL VETTORE CON I FILES ZIP
			orig = cercaFileZip();
		}catch(Exception e5){
			esecuzioneProcedura = 0;
			// SCRITTURA LOG
			try {
				pathLog.log("Errori durante la lettura del file di configurazione ",e5.getMessage());
			} catch (IOException e1) {
				e1.printStackTrace();
			} 
		}
	}
	
	
	// RESTIUTISCO VETTORE CON LA LISTA DEI FILE ZIP IN pathFolder
	public Vector cercaFileZip(){
		// INSTANZIO VETTORE PER LA RESTITUZIONE DEI FILES
		Vector returnValue = new Vector();
		try{		
			// APRO CARTELLA ORIGINE
			File fromDir = new File(pathFolderZip);
			// TUTTI I FILES CONTENUTI IN CARTELLA ORIGINE
			File[] filesInDir = fromDir.listFiles();	
			// FACCIO SCORRERE TUTTI I FILE
			for(int i=0;i<filesInDir.length;i++){	
				// SE HA ESTENSIONE ZIP
				if (filesInDir[i].getName().endsWith(".zip")){
					// LO AGGIUNGO NEL VETTORE
					returnValue.add(filesInDir[i]);
				}
			}
		}catch(Exception e){
			// SCRITTURA LOG
			try {
				pathLog.log("Errori durante la lettura dei files da pathFolderZip ",e.getMessage());
			} catch (IOException e1) {
				e1.printStackTrace();
			} 
		}
		return returnValue;		
	}
	
	
	// CONTROLLO CICLICO DELLA CARTELLA
	public void monitorFolder() {

		Vector cambiamentiFolder; 
		while (esecuzioneProcedura > 0){
			// CARICO IL VETTORE PER IL CONTROLLO
			mod = new Vector();
			mod = cercaFileZip();
			// CONFRONTO
			cambiamentiFolder = new Vector();
			cambiamentiFolder = trovaDifferenze(orig,mod);
			// CONTROLLO CAMBIAMENTI
			for(int a = 0;a < cambiamentiFolder.size();a++){
				// RECUPERO FILE
				File fileZip = (File)cambiamentiFolder.elementAt(a);
				// SCRITTURA LOG
				try {
					pathLog.log("Nuovo File Zip Rilevato ",fileZip.getName());
				} catch (IOException e1) {
					e1.printStackTrace();
				} 
				// UNZIP DEL FILE
				try {
					unzip(fileZip.getAbsolutePath());
					// SCRITTURA LOG
					try {
						pathLog.log("Unzip del file in ",pathFolderUnzip);
					} catch (IOException e1) {
						e1.printStackTrace();
					} 
				} catch (IOException e2) {
					// SCRITTURA LOG
					try {
						pathLog.log("UNZIP DEL FILE NON RIUSCITO !!! ",e2.getMessage());
					} catch (IOException e1) {
						e1.printStackTrace();
					}
				}


				// SCRITTURA LOG
				try {
					pathLog.log("Nuovo path del file zip ",pathMoveFileZip+fileZip.getName());
				} catch (IOException e1) {
					e1.printStackTrace();
				} 
			} // FINE CICLO FOR
			
			// ATTESA ESPRESSA IN MILLISECONDI
			
			try{
				Thread.sleep(timeControl);
			}catch(InterruptedException e){
				// SCRITTURA LOG
				try {
					pathLog.log("Errori durante tempo di attesa controllo cartella ",e.getMessage());
				} catch (IOException e1) {
					e1.printStackTrace();
				} 
			}			
		} // FINE WHILE
	}


	// RESTIUTISCO VETTORE CON LA LISTA DEI FILE ZIP IN pathFolder
	public Vector trovaDifferenze(Vector v1, Vector v2){
		// INSTANZIO VETTORE PER LA RESTITUZIONE DELLE DIFFERENZE
		Vector returnValue = new Vector();
		// FACCIO SCORRERE TUTTI I FILE DI v2
		for(int i=0;i<v2.size();i++){
			boolean fileTrovato = false;	
			// CERCO IN v1 il FILE
			for(int a=0;a<v1.size();a++){
				// SE LO TROVA ESCE DAL CICLO
				if(v2.elementAt(i).equals(v1.elementAt(a))){
					fileTrovato = true;
					a=v1.size();
				}
			}
			// SE NON L'HA TROVATO LO AGGINGO AL VETTORE DI DIFFERENZE
			if (fileTrovato==false){
				returnValue.add(v2.elementAt(i));
			}	
		}
		return returnValue;		
	}


	// FUNZIONE PER DECOMPRIMERE I FILES ZIP
	public void unzip(String pathFile) throws IOException {
		try {
			int BUFFER = 2048;
			BufferedOutputStream dest = null;
			BufferedInputStream is = null;
			ZipEntry entry;
			ZipFile zipfile = new ZipFile(pathFile);
			Enumeration e = zipfile.entries();
			while(e.hasMoreElements()) {
				entry = (ZipEntry) e.nextElement();
				is = new BufferedInputStream(zipfile.getInputStream(entry));
				int count;
				byte data[] = new byte[BUFFER];
				FileOutputStream fos = new FileOutputStream(pathFolderUnzip+entry.getName());
				dest = new 
				BufferedOutputStream(fos, BUFFER);
				while ((count = is.read(data, 0, BUFFER)) 
					!= -1) {
					dest.write(data, 0, count);
				}
				dest.flush();
				dest.close();
				is.close();
				zipfile.close();
			}
		} catch(Exception e) {
			e.printStackTrace();
		}

	}


	



}