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< String > 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< String > 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.