Boa noite,
Estou tabalhando em uma classe que descompacta, porém, está totalmente fora do ideal.
1- Arquivo de 5K copactado pelo windows no formato zip. Ficou com 2K de tamanho, mas apos descompactar com o java ficou com 366K e ilegivel.
2- Uma pasta com arquivos. Todos os arquivos depois de compactados somaram, 666KB. Apos descompactar com o sistema, todos os arquivos, internos do zip ficaram com 1KB e ilegiveis.
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
/**
*
* @author Kaos
*/
public class Descompactador {
private String nomeDoArquivo;
private String nomeDoDiretorio;
private File file;
private File diretorio;
private ZipFile zipFile;
private ZipEntry zipEntry;
private int bytesLidos;
private InputStream inputStream;
private OutputStream outputStream;
private byte[] buffer;
public Descompactador(
String informeNomeDoArquivo,
String informeDiretorio
) {
this.nomeDoArquivo = informeNomeDoArquivo;
this.nomeDoDiretorio = informeDiretorio;
this.file = null;
this.zipFile = null;
this.inputStream = null;
this.outputStream = null;
this.zipEntry = null;
this.bytesLidos = 0;
this.buffer = new byte[8192]; // 16KB = 16384 / 8KB = 8192 / 4KB = 4096
}
public void descompactaArquivo() throws IOException {
// Cria referencia ao diretorio.
this.diretorio = new File(this.nomeDoDiretorio);
// Verifica se o diretorio existe caso não o cria.
if(!this.diretorio.exists()) {
this.diretorio.mkdir();
}
// Verifica se o arquivo informado realmente é diretorio.
// Caso não seja, gera, erro de saida.
if(!this.diretorio.isDirectory()) {
throw new IOException("Destino invalido!");
}
// Carrega arquivo compactado em buffer.
this.zipFile = new ZipFile(this.nomeDoArquivo);
// Prepara um Enumeration para ser usado na iteração.
Enumeration e = this.zipFile.entries();
// Trata todas as saidas do arquivo.
while(e.hasMoreElements()) {
// Recebe o item para ser tratado pelo descompactador.
this.zipEntry = (ZipEntry) e.nextElement();
// Cria uma referencia a um arquivo na pasta informada.
this.file = new File(this.diretorio, this.zipEntry.getName());
// Caso seja uma pasta e não exista o cria.
if(this.zipEntry.isDirectory() && !this.file.exists()) {
this.file.mkdir();
continue;
}
// Cria arquivo pai caso não exista.
if(!this.file.getParentFile().exists()) {
this.file.getParentFile().mkdir();
}
// Le arquivo em buffer e cria em disco.
try {
// Pega saida e armeza em stream para manipulação.
this.inputStream = this.zipFile.getInputStream(this.zipEntry);
// Prepara a saida gerando o arquivo.
this.outputStream = new FileOutputStream(this.file);
if(this.inputStream == null) {
// Gera erro caso buffer seja invalido.
throw new ZipException(
// Mensagem de aviso.
"Erro ao ler arquivo: " + this.zipEntry.getName()
);
}
// Armazena o tamanho do buffer, enquanto é feito, a leitura.
// Servindo de parametro para criação do arquivo.
// ((this.bytesLidos = this.inputStream.read()) > 0)
while((this.bytesLidos = this.inputStream.read()) > 0) {
this.outputStream.write(this.buffer, 0, this.bytesLidos);
}
} finally {
if(this.inputStream != null) {
this.inputStream.close();
}
if(this.outputStream != null) {
this.outputStream.close();
}
}
}
}
}
[]s
Era a linha, 100, do código que passei. Fiz o ajuste abaixo e funcionou: