Bom galera tenho uma dúvida pra desafiar voces:
Peguei o exemplo do arquivo zip neste site e fiz algumas modificações com o objetivo somente de zipar, listar, e descompactar, só que está dando um erro em tempo de execução.
Esta é a função para compactar, o erro está na função adicionaraoZip, o projeto completo (somente duas classes) vem em anexo.
private void comprimir() throws IOException {
FileOutputStream fos;
BufferedOutputStream bos;
System.out.print("Digite o caminho da pasta onde tem o(s) arquivo(s) quer sera(ao) comprimido(s) "); //so sube fazer pra pegar pasta
File arquivotemp = new File(sc.nextLine()); //como a funcao criarZip qer um array de files, vou fazer essa gambiarra aqui pra passar o array de string com os nomes do arquivo em um array de files
File[] arquivos;
if (arquivotemp.isDirectory()) {
String[] temp = arquivotemp.list();
System.out.println("tamanho: "+temp.length);
arquivos = new File[temp.length];
for (int i = 0; i < temp.length; i++) {
arquivos[i] = new File(temp[i]);
}
} else {
arquivos = new File[1];
arquivos[0] = arquivotemp;
}
System.out.print("Digite o nome do arquivo de output ");
File arquivoZip = new File(sc.nextLine());
fos = new FileOutputStream(arquivoZip);
bos = new BufferedOutputStream(fos, 2048);
//List listaEntradasZip = criarZip(bos, arquivos); //aqui vem nosso array de Files
criarZip(bos, arquivos); //aqui vem nosso array de Files
}
private void criarZip (OutputStream os, File[] arquivos) throws ZipException, IOException {
if (arquivos == null || arquivos.length < 1) { //gostei dessa
throw new ZipException ("O diretório está vazio!!");
}
List listaEntradasZip = new ArrayList();
ZipOutputStream zos; //sempre vai ter que ter o imput e o output, as entradas são as entry que sao cada item do zip
zos = new ZipOutputStream(os); //isso era pra ficar dentro do try mas como n da certo vou logo botar aqui essa bosta
try {
for(int i = 0; i < arquivos.length; i++) { //nesse for, para cada file do array, bota o caminho no método adicionaraozip
String caminhoInicial = arquivos[i].getParent(); //nome do diretório (caminnho)
System.out.println(arquivos[i]+"-> "+caminhoInicial);
List novasEntradas = adicionarArquivoNoZip(zos, arquivos[i], caminhoInicial);
if(novasEntradas != null) {
listaEntradasZip.addAll (novasEntradas); //quando acabar adiciona todas as novas
}
}
} finally {
if(zos != null) {
try {
zos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
private List adicionarArquivoNoZip (ZipOutputStream zos, File arquivo, String caminhoInicial) throws IOException { //o output pra gravar, o arquivo pra colocar no output pra gravar, e o caminho do arquivo pra colocar no output pra gravar
List listaEntradasZip = new ArrayList();
FileInputStream fis;
BufferedInputStream bis;
//if (caminhoInicial == null) caminhoInicial = ".\\";
byte buffer[] = new byte[2048];
try {
//diretórios não são adicionados
if( arquivo.isDirectory() ) {
//recursivamente adiciona os arquivos dos diretórios abaixo
File[] arquivos = arquivo.listFiles();
for( int i=0; i<arquivos.length; i++ ) {
List novasEntradas = adicionarArquivoNoZip( zos, arquivos[i], caminhoInicial );
if( novasEntradas != null ) {
listaEntradasZip.addAll( novasEntradas );
}
}
return listaEntradasZip;
}
String caminhoEntradaZip = null;
int idx = arquivo.getAbsolutePath().indexOf(caminhoInicial);
if( idx >= 0 ) {
//calcula os diretórios a partir do diretório inicial
//isso serve para não colocar uma entrada com o caminho completo
caminhoEntradaZip = arquivo.getAbsolutePath().substring( idx+caminhoInicial.length()+1 );
}
ZipEntry entrada = new ZipEntry( caminhoEntradaZip );
zos.putNextEntry( entrada );
zos.setMethod( ZipOutputStream.DEFLATED );
fis = new FileInputStream( arquivo );
bis = new BufferedInputStream( fis, 2048 );
int bytesLidos = 0;
while((bytesLidos = bis.read(buffer, 0, 2048)) != -1) {
zos.write( buffer, 0, bytesLidos );
}
listaEntradasZip.add( entrada );
}
finally {
/*
if( bis != null ) {
try {
bis.close();
} catch( Exception e ) {}
}
if( fis != null ) {
try {
fis.close();
} catch( Exception e ) {}
}
*/
}
return listaEntradasZip;
}