Dica rápida!
Segue uma dica rápida para realizar a compactação de arquivos no Android, não deixem de visitar o artigo original1Classe
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Compress {
private static final int BUFFER = 2048;
private String[] _files;
private String _zipFile;
public Compress(String[] files, String zipFile) {
_files = files;
_zipFile = zipFile;
}
public void zip() {
try {
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream(_zipFile);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
byte data[] = new byte[BUFFER];
for(int i=0; i < _files.length; i++) {
Log.v("Compress", "Adding: " + _files[i]);
FileInputStream fi = new FileInputStream(_files[i]);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1));
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
Exemplo de uso
Propriedades para usar a classe:private static final int BUFFER = 2048;
private String[] _files;
private String _zipFile;
A propriedads BUFFER é usada para leitura dos dados e escrita no stream, o array _files armazenará o nome dos arquivos que serão compactados (juntamente com seus caminhos) e _zipFile será o nome que o arquiv and the third is the name of the zip file (path as well).Construtor:
public Compress(String[] files, String zipFile) {
_files = files;
_zipFile = zipFile;
}
O construtor recebe um array de arquivos e um nome para o arquivo compactado, armazenando ambos no propriedades.Método para compactar:
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream(_zipFile);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
byte data[] = new byte[BUFFER];
A primeira coisa a ser feita é configurar nosso BufferedInputStream, que será usado para ler os dados dos arquivos (para cada um existente em nosso array).O FileOutputStream será usado para criar o arquivo compactado (arquivo destino) e também será usado pelo objeto de escrita ZipOutputStream.
Para mais detalhes sobre FileOutputStream e ZipOutputStream .
for(int i=0; i < _files.length; i++) {
Log.v("Compress", "Adding: " + _files[i]);
FileInputStream fi = new FileInputStream(_files[i]);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1));
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
Agora o loop principal, onde cada arquivo em nosso array _files será compactado dentrodo arquivo zip.Primeiro o FileInputStream é configurado para a leitura dos arquivos, o BufferedInputStream irá manipular a quantidade de dados que serão lidos por vez, com base em nosso BUFFER.
O ZipEntry é usado para adicionar o arquivo atual na estrutura, por exemplo, se adicionarmos mnt/sdcard/data/myzip.zip’, será criado essaestrutura de diretório dentro do arquivo zip, logo se a intenção for a de adicionar apenas o arquivo (sem a estrutura de diretório) deve-se alterar esse comportamento.
Uma vez que o objeto entry tenha sido carregado, podemos adicionalo ao zip(out.putNextEntry).
Por fim temos outro loop, usado para ler os dados (2048 bytes por vez) e escrever o arquivo compactado.
A ultima etapa fica por conta do fechamento dos streams.
Comentários
Postar um comentário
Obrigado por Participar do programero, fique a vontade para agradecer, retificar, perguntar ou sugerir.