Como implementar corretamente [Resolvido]

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.