Abrir zip, adicionar arquivo ao .zip e fechar

Oi galera, td bem???

tenho duas perguntas, caso alguem ai possa me ajudar

java.util.zip (ou qualquer outra api que me sirva) tem algum metodo para criar uma pasta dentro do arquivo zip???

no meu caso especificamente, to pegando os arquivos de uma pasta, ao achar uma subpasta eu chamo o mesmo metodo recursivamente, colocando no parametro do zipentry subpasta\arquivo.extensão

entry = new ZipEntry(subPasta+arquivos[j].getName());
saida.putNextEntry(entry);//saida é o meu zipoutputstream

o problema é que quando essa pasta esta vazia não tenta cria o arquivo e por isso não tenta cria a pasta tb…

uma outra duvida é se tem algum jeito de abrir o arquivo zip (acredito que com filezip ao inves de zipinputstream), adicionar um arquivo apenas e fechar, e ao inves de pega um entry para cada arquivo, mais outro para o arquivo a ser adicionado e depois re-escrever o .zip tudo denovo…

vlw ai galera, desde ja…

Que eu saiba, os programas que trabalham com arquivos zip funcionam internamente criando um arquivo temporário e copiando os arquivos já comprimidos para o novo arquivo.
É que o formato do arquivo .zip é inadequado para modificação incremental (que é o que você quer fazer). O arquivo zip tem sempre os arquivos comprimidos contíguos e a tabela dos arquivos comprimidos é sempre no final do arquivo; isso acaba fatalmente forçando a criar um arquivo temporário quase tão grande quanto o arquivo original.

tingol, isso significa que para mim adiciona um unico arquivo dentro do .zip eu tenho que cria um temporario e coloca onovo arquivo a ser adicionado la e depois as entradas do arquivo ja existente???

fazer isso eu até faria numa boa, mais tava meio preocupado com performance… isso seria ter que refazer o trabalho, o que nem ia da tanto trabalho pra mim, mais considerando um arquivo grande, por exemplo acima de 500 mega, isso pode demora um pokinhu… bom…de qualquer jeito isso eu perguntei masi na curiosidade, no simples prazer de saber como se faz… enfim

vc saberia me dizer se tem algum metodo ou algum jeito sei la, de se criar pastas vaizas dentro do arquivo .zip???

to passando meu codigo pra vc ver oq q eu to fazendo seisso te ajuda a me ajuda… e obrigadão pela ajuda…

de repente tb fica pra alguem que esteja pesquisando sobre isso no futuro…

        public void criaObjetos(final String extensoes[], final boolean copSub, String diretorio, String arquivoSaida){
        
        FileInputStream  entrada;
        FileOutputStream caminho;
        File raiz;
        File[] arquivos;
        File[] pastas;
        ZipOutputStream saida = null;   
        ZipEntry entry = null;
        byte[] buffer;
        
        try{
            
            
            raiz=new File(diretorio);
            caminho = new FileOutputStream(arquivoSaida);
            saida=new ZipOutputStream(caminho);
            
            saida.setLevel(9);
                        
            criaZip(extensoes, copSub, raiz, saida, "");

            saida.close();
            
        }catch(Exception e ){
            System.out.println("deu merda");
        }       
    }
        
    public void criaZip(final String extensoes[], final boolean copSub, File pastaEntrada, ZipOutputStream saida, String subPasta){
        
        File[] arquivos = null;
        File[] pastas = null;
        FileInputStream novoArquivo = null;
        ZipEntry entry = null;
        FileFilter extencoes, filtroPastas;
        
        try{
            if (extensoes!=null){
                for (int i=0;i<extensoes.length;i++){

                    final int I=i;
                    extencoes = new FileFilter() { 
                            public boolean accept(File f){
                                    return f.getName().endsWith(extensoes[I]);
                            } 
                    };

                    arquivos = pastaEntrada.listFiles(extencoes);



                    for (int j=0;j<arquivos.length;j++){

                        System.out.println(subPasta+"\"+arquivos[j].getName());

                        novoArquivo = new FileInputStream(arquivos[j]);
                        entry = new ZipEntry(subPasta+arquivos[j].getName());
                        saida.putNextEntry(entry);

                        int tamanho = novoArquivo.available();
                        byte[] buffer = new byte[1024];
                        for (status=0;status<=tamanho;status+=buffer.length){
                            novoArquivo.read(buffer);
                            saida.write(buffer);
                        }
                    }

    //                if (arquivos.length><1){
    //                    javax.swing.JOptionPane.showMessageDialog(null, "encontrei uma vazia "+pastaEntrada.getName());
    //                    byte[] buffer = new byte[1024];
    //                    novoArquivo = new FileInputStream(pastaEntrada);
    //                    entry = new ZipEntry(pastaEntrada.getName());
    //                    saida.putNextEntry(entry);
    //                    novoArquivo.read();
    //                    saida.write(novoArquivo.available());
    //                    
    //                    break;
    //                }
                }

            }else{
                
                arquivos = pastaEntrada.listFiles();
              
                for (int j=0;j<arquivos.length;j++){
                       
                    if (!arquivos[j].isDirectory()){
                            System.out.println(subPasta+"\"+arquivos[j].getName());

                            novoArquivo = new FileInputStream(arquivos[j]);
                            entry = new ZipEntry(subPasta+arquivos[j].getName());
                            saida.putNextEntry(entry);

                            int tamanho = novoArquivo.available();
                            byte[] buffer = new byte[1024];
                            for (status=0;status<=tamanho;status+=buffer.length){
                                novoArquivo.read(buffer);
                                saida.write(buffer);
                            }
                    }       
                }
            }        
                
            filtroPastas = new FileFilter() { 
                    public boolean accept(File f){
                            return f.isDirectory();
                    } 
            };

            pastas = pastaEntrada.listFiles(filtroPastas);

            for (int j=0;j<pastas.length;j++){

                criaZip(extensoes, copSub, pastas[j], saida, pastas[j].getName()+"\");

            }
    
        }catch(Exception e){
            System.out.println("deu merda no final");
        }
    } 

editando, aquela parte comentada foi que eu tentei cria uma pasta do jeito q ta la… isso ai gera exceção…

se num der pra cria uma pasta no arquivo zip, da pra compactar uma pasta vazia ??? tipo, se eu quero gravar uma determinada pasta, ter o backup de como que akela pasta estava em cada momento, e tenho uma subpasta vazia, eu quero conter a subpasta vazia no meu zip…

ao inves de criar uma subpasta vazia e copiar o nome, eu poderia copiar a subpasta em si… da pra fazer isso???

obrigado