Boa tarde,
Pelo que li, devo implementar como generico, mas não faço idéia de como faze-lo. O que usei até o momento, gerou avisos estranhos, alguma ideia?
[]s
Boa tarde,
Pelo que li, devo implementar como generico, mas não faço idéia de como faze-lo. O que usei até o momento, gerou avisos estranhos, alguma ideia?
[]s
Implementar o que?
O que você está querendo fazer?
davidbuzatto, Bom dia.
Esse Enumeration para que não mostre esse aviso da imagem. A imagem está no primeiro post.
Enumeration e = this.zipFile.entries();
A classe em si está operando de forma estranha, o código todo está no post “Descompactador - Muito loco”, mas acredito que não seja pelo Enumeration. Mas gostaria de acertar para poder remover o aviso da IDE, exibido, na imagem.
[]s
Bom dia,
Consegui acertar para resolver o alerta que era exibido. O problema estava em que não era informado um tipo para o Enumeration. Depois de tentar um ajuste, a IDE, fez uma sugestão ao aceitar o aviso despareceu. O código ficou conforme exibido abaixo:
// Prepara um Enumeration para ser usado na iteração.
Enumeration<? extends ZipEntry> e = this.zipFile.entries();
Assim foi possivel transformar, o generico (?) em ZipEntry, acertando a sintaxe.
[]s
Ainda tem coisa estranha aí. Simplemesmente Enumeration<ZipEntry> não funcionou?
O único lugar que usamos wildcards (como a ?) é quando você está aceitando uma lista ou enumeration como parâmetro.
Boa tarde,
Era o que havia tentando, quando tentei implementar, mas acabou dando erro. Abaixo segue o aviso:
... incompatible types
found : java.util.Enumeration<capture#672 of ? extends java.util.zip.ZipEntry>
required: java.util.Enumeration<java.util.zip.ZipEntry>
Enumeration<ZipEntry> e = this.zipFile.entries();
Ainda não havia ouvido o termo, wildcards, então não sei se se encaixa no código abaixo:
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<? extends ZipEntry> e = this.zipFile.entries();
// Trata todas as saidas do arquivo.
while(e.hasMoreElements()) {
// Reinicia o valor a cada novo elemento.
this.bytesLidos = 0;
// Recebe o item para ser tratado pelo descompactador.
this.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.
while((this.bytesLidos = this.inputStream.read(this.buffer)) > 0) {
this.outputStream.write(this.buffer, 0, this.bytesLidos);
}
} finally {
if(this.inputStream != null) {
this.inputStream.close();
}
if(this.outputStream != null) {
this.outputStream.close();
}
}
}
}
}
Na linha 47, ele recebe algumas informações, de um zipFile.entries(). Dentro do que entendi, poderia ser considerado uma lista?
Depois vem o trecho:
this.zipEntry = e.nextElement();
this.zipEntry recebe um elemento do Enumeration sem cast ou coisa do tipo. Não sei se justifica… A mudanças foram motivadas pelo erro da imagem do começo do post, pois, havia um aviso que faltava declarar um tipo.
O que vc acha?
[]s
Putz, agora que vi. É porque a classe ZipFile retornou essa assinatura esquisita.
Eu geralmente uso o ZipInputStream e o ZipOutputStream diretamente.
Boa noite,
Vini, manipular dos stream’s, diretamente é uma ideia boa. Depois que implementar o de compactação, pois, to numa correria que só vendo pra ternimar vou tentar algo do tipo.
Obrigado.
[]s
O código nem fica muito diferente do que você fez. Veja o software de esteganografia que deixei no GUJ há uns tempos atrás, pois lá faço a compactação usando os streams.