Boa tarde! Estou iniciando no Java e queria uma força da comunidade.
Estou tentando descompactar um arquivo zip que possui uma estrutura de pastas, mais ou menos, como essa: Pasta — Pasta1 — Pasta1.1 — Pasta1.2 — Pasta1.3
Pasta2 — Pasta2.1
Pasta3 — Pasta3.1
Consigo descompactar sem problemas Tudo oq está na Pasta1. Inclusive as pastas 1.1, 1.2 e 1.3.
Mas na hora de passar para a Pasta2, retorna a seguinte exception:
Exception in thread “main” java.lang.IllegalArgumentException: MALFORMED
at java.util.zip.ZipCoder.toString(Unknown Source)
at java.util.zip.ZipFile.getZipEntry(Unknown Source)
at java.util.zip.ZipFile.access$900(Unknown Source)
at java.util.zip.ZipFile$ZipEntryIterator.next(Unknown Source)
at java.util.zip.ZipFile$ZipEntryIterator.nextElement(Unknown Source)
at java.util.zip.ZipFile$ZipEntryIterator.nextElement(Unknown Source)
at zipUnzip.ZipHelper.unzip(ZipHelper.java:85)
at zipUnzip.Main.main(Main.java:28)
Onde será que estou errando?! Mandando abaixo a classe que estou usando pra isso!
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Stack;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class ZipHelper {
public void zip(File[] files, File outputFile) throws IOException {
if (files != null && files.length > 0) {
ZipOutputStream out = new ZipOutputStream(
new FileOutputStream(outputFile));
Stack<File> parentDirs = new Stack<File>();
zipFiles(parentDirs, files, out);
out.close();
}
}
private void zipFiles(Stack<File> parentDirs, File[] files,
ZipOutputStream out) throws IOException {
byte[] buf = new byte[1024];
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
//se a entrad é um diretório, empilha o diretório e
//chama o mesmo método recursivamente
parentDirs.push(files[i]);
zipFiles(parentDirs, files[i].listFiles(), out);
//após processar as entradas do diretório, desempilha
parentDirs.pop();
} else {
FileInputStream in = new FileInputStream(files[i]);
//itera sobre os itens da pilha para montar o caminho
//completo do arquivo
String path = "";
for(File parentDir : parentDirs) {
path += parentDir.getName() + "/";
}
//grava os dados no arquivo zip
out.putNextEntry(new ZipEntry(path + files[i].getName()));
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
in.close();
}
}
}
public static void unzip(File zipFile, File dir) throws IOException {
ZipFile zip = null;
File arquivo = null;
InputStream is = null;
OutputStream os = null;
byte[] buffer = new byte[1024];
try {
// cria diretório informado, caso não exista
if (!dir.exists()) {
dir.mkdirs();
}
if (!dir.exists() || !dir.isDirectory()) {
throw new IOException("O diretório " + dir.getName() +
" não é um diretório válido");
}
zip = new ZipFile(zipFile);
Enumeration e = zip.entries();
while (e.hasMoreElements()) {
ZipEntry entrada = (ZipEntry) e.nextElement();
arquivo = new File(dir, entrada.getName());
// se for diretório inexistente, cria a estrutura e pula
// pra próxima entrada
if (entrada.isDirectory() && !arquivo.exists()) {
arquivo.mkdirs();
continue;
}
// se a estrutura de diretórios não existe, cria
if (!arquivo.getParentFile().exists()) {
arquivo.getParentFile().mkdirs();
}
try {
// lê o arquivo do zip e grava em disco
is = zip.getInputStream(entrada);
os = new FileOutputStream(arquivo);
int bytesLidos = 0;
if (is == null) {
throw new ZipException("Erro ao ler a entrada do zip: " +
entrada.getName());
}
while ((bytesLidos = is.read(buffer)) > 0) {
os.write(buffer, 0, bytesLidos);
}
} finally {
if (is != null) {
try {
is.close();
} catch (Exception ex) {
}
}
if (os != null) {
try {
os.close();
} catch (Exception ex) {
}
}
}
}
} finally {
if (zip != null) {
try {
zip.close();
} catch (Exception e) {
}
}
}
}
}
Aqui é a minha classe Main:
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String args[]) throws IOException{
File zipFile = new File("C:\\PastaZip\\work.zip");
zipFile.exists();
File dir = new File("C:\\Pasta\\UnZip\\");
dir.isDirectory();
ZipHelper.unzip(zipFile, dir);
}
}