Dúvida sobre performance de buffered streams; lógica; zipentries

1 resposta
Y

E ae pessoal do guj… venho aqui com algumas dúvidas.

Estou desenvolvendo um pequeno aplicativo de backup. Ele basicamente tem o objetivo de gerar um arquivo zip com todos os arquivos correpondentes de determinada pasta e incluir dentor dele um arquivo de log.

Minha primeira dúvida é sobre a performance da cópia dos arquivos. Atualmente eu estou fazendo da seguinte forma:

zipFile.putNextEntry(new ZipEntry(actualFile));

            contentStream = new FileInputStream(path);
            content = new BufferedInputStream(contentStream, contentStream.available() / 10);

            int data;
            byte[] fileData = new byte[content.available()];
            int init = 0;
            int progress = content.available() / 100;
            int pos = 0;
            int dataPosition = 0;

            while ((data = content.read()) != -1)
              { fileData[dataPosition++] = (byte) data; }

            zipFile.write(fileData, 0, fileData.length);
            zipFile.closeEntry();

E´stou fazendo "correto"? Quando alterei de streams comuns para as buferizadas, exatamente como está acima, notei um aumento de performance considerável, acredito que uma melhora de pelo menos 30% na velocidade da cópia de arquivos binários.


Minha segunda dúvida é: é possível criar uma pasta vazia dentro de um arquivo zip? Tentei fazê-lo, mas a ZipEntry grava um arquivo sem extensão dentro do zip.


Minha terceira dúvida é: nesse processo de backup, o método principal "alimenta" um objeto Logger com informações sobre a cópia dos arquivos. Ocorre que eu implementei esse Logger originalmente para uma versão que trabalhava com cópia simples, sem zip. Resultado: ele possibilita apenas duas formas de se salvar as informações de log: saveTo(File file), um método para onde eu passo um objeto File e o log é salvo nele ou posso solocitar um getLogInfo() que me retorna um ArrayList&lt String &gt contendo as linhas do log. O que preciso fazer é salvar as informações de log num arquivo chamado log.log dentro do arquivo zip. A maneira que eu havia pensado é bem gambiarra: crio um arquivo qualquer no disco; salvo as informações de log nele pelo saveTo(); uso um FileInputStream para pegar os bytes do arquivo e enviar para o zip; excluo o arquivo de texto que estava salvo no disco.

Alguém saberia me indicar uma opção melhor? O que também pensei é pegar esse ArrayList&lt String &gt e de alguma forma salvá-las num arquivo dentro do zip, mas não sei se é possível eu enviar um fluxo criado abstratamente, ou seja, um fluxo que provém da memória e não de algum arquivo ou rede. Seria mais ou menos eu converter Strings em um fluxo de bytes; é possível?


Desde já agradeço.

1 Resposta

Y

Esqueci de citar mais um probleminha que estou tendo com os zips: os nomes de arquivos que contém acentos do tipo ~^´` estão ficando com os nomes incorretos dentro do zip. Alguém sabe como resolver isso? Pois não encontrei nenhum tipo de configuração referente ao char-set ou algo similar no ZipOutputStream.

Criado 7 de abril de 2007
Ultima resposta 7 de abr. de 2007
Respostas 1
Participantes 1