Amigos,
Java possui uma ou mais classes para compactar arquivos.
É possível compactar um arquivo apenas em memória do computador, sem gravá-lo no disco?
A intenção é compactar um arquivo texto selecionado pelo usuário, mantendo o arquivo compactado na memória do PC, transmitir esse arquivo compactado utilizando socket e depois descartá-lo da memória, sem ter que criar provavelmente uma pasta e um arquivo físico na máquina do usuário.
Opa, você sempre pode armazenar o conteúdo do arquivo (compactado ou não) como um array de bytes.
Dado que as classes de compactação usam InputStream e OutputStream, talvez você possa usar as implementações ByteArrayInputStream e ByteArrayOutputStream pra quebrar este galho pra você em memória.
A
andredf
kicolobo:
Opa, você sempre pode armazenar o conteúdo do arquivo (compactado ou não) como um array de bytes.
Dado que as classes de compactação usam InputStream e OutputStream, talvez você possa usar as implementações ByteArrayInputStream e ByteArrayOutputStream pra quebrar este galho pra você em memória.
Valeu pela dica!
Você consegue dar uma pequena demonstração via código?
B
bezier_curve
packageguj;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.ByteArrayOutputStream;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.zip.GZIPOutputStream;publicclassExemploCompressaoArquivos{publicvoidcomprimirParaArquivo(StringarqEntrada,StringarqSaida)throwsIOException{GZIPOutputStreamgzos=null;BufferedInputStreambis=null;byte[]buffer=newbyte[8*1024];try{intnBytes;bis=newBufferedInputStream(newFileInputStream(arqEntrada));gzos=newGZIPOutputStream(newBufferedOutputStream(newFileOutputStream(arqSaida)));while((nBytes=bis.read(buffer))>0)gzos.write(buffer,0,nBytes);}finally{gzos.close();bis.close();}}publicbyte[]comprimirParaMemoria(StringarqEntrada)throwsIOException{GZIPOutputStreamgzos=null;ByteArrayOutputStreambaos=newByteArrayOutputStream();BufferedInputStreambis=null;byte[]buffer=newbyte[8*1024];try{intnBytes;bis=newBufferedInputStream(newFileInputStream(arqEntrada));gzos=newGZIPOutputStream(baos);while((nBytes=bis.read(buffer))>0)gzos.write(buffer,0,nBytes);}finally{gzos.close();bis.close();}returnbaos.toByteArray();}/** * @param args */publicstaticvoidmain(String[]args)throwsIOException{// TODO Auto-generated method stubExemploCompressaoArquivoseca=newExemploCompressaoArquivos();eca.comprimirParaArquivo(args[0],args[1]);byte[]bytes=eca.comprimirParaMemoria(args[0]);System.out.println(bytes.length);// confronte com o arquivo de saída para ver se ficou do mesmo tamanho}}
Use gzip -d para descompactar o arquivo gerado e ver se ele bate com o original.
A
andredf
bezier curve:
packageguj;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.ByteArrayOutputStream;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.zip.GZIPOutputStream;publicclassExemploCompressaoArquivos{publicvoidcomprimirParaArquivo(StringarqEntrada,StringarqSaida)throwsIOException{GZIPOutputStreamgzos=null;BufferedInputStreambis=null;byte[]buffer=newbyte[8*1024];try{intnBytes;bis=newBufferedInputStream(newFileInputStream(arqEntrada));gzos=newGZIPOutputStream(newBufferedOutputStream(newFileOutputStream(arqSaida)));while((nBytes=bis.read(buffer))>0)gzos.write(buffer,0,nBytes);}finally{gzos.close();bis.close();}}publicbyte[]comprimirParaMemoria(StringarqEntrada)throwsIOException{GZIPOutputStreamgzos=null;ByteArrayOutputStreambaos=newByteArrayOutputStream();BufferedInputStreambis=null;byte[]buffer=newbyte[8*1024];try{intnBytes;bis=newBufferedInputStream(newFileInputStream(arqEntrada));gzos=newGZIPOutputStream(baos);while((nBytes=bis.read(buffer))>0)gzos.write(buffer,0,nBytes);}finally{gzos.close();bis.close();}returnbaos.toByteArray();}/** * @param args */publicstaticvoidmain(String[]args)throwsIOException{// TODO Auto-generated method stubExemploCompressaoArquivoseca=newExemploCompressaoArquivos();eca.comprimirParaArquivo(args[0],args[1]);byte[]bytes=eca.comprimirParaMemoria(args[0]);System.out.println(bytes.length);// confronte com o arquivo de saída para ver se ficou do mesmo tamanho}}
Use gzip -d para descompactar o arquivo gerado e ver se ele bate com o original.
Obrigado pela ajuda.
Acabei utilizando o método abaixo que utiliza as classes Zip.
// Compacta arquivo na memóriapublicbyte[]compactarArquivo(StringarqEntrada)throwsIOException{intcont;byte[]dados=newbyte[4096];BufferedInputStreamorigem;FileInputStreamstreamDeEntrada;ByteArrayOutputStreamdestino;ZipOutputStreamsaida;ZipEntryentry;try{destino=newByteArrayOutputStream();saida=newZipOutputStream(newBufferedOutputStream(destino));Filef=newFile(arqEntrada);streamDeEntrada=newFileInputStream(f);origem=newBufferedInputStream(streamDeEntrada,4096);entry=newZipEntry(f.getName());saida.putNextEntry(entry);while((cont=origem.read(dados,0,4096))!=-1){saida.write(dados,0,cont);notificarObservadores(Util.PROCESSANDO);}origem.close();saida.close();returndestino.toByteArray();}catch(IOExceptione){thrownewIOException(e.getMessage());}}
E
entanglement
Isso é má prática. A mensagem de erro é uma das coisas menos informativas de uma exceção (esse tipo de coisa que você fez destrói o stack trace, por exemplo).
Em vez disso, simplesmente não ponha um try/catch (já que você disse que seu método “throws IOException”) ou então faça algo como:
Isso é má prática. A mensagem de erro é uma das coisas menos informativas de uma exceção (esse tipo de coisa que você fez destrói o stack trace, por exemplo).
Em vez disso, simplesmente não ponha um try/catch (já que você disse que seu método “throws IOException”) ou então faça algo como:
Eu copiei o código faz algum tempo da internet e fui alterando alguma coisa.
O que seria melhor? Manter ou tirar o try/catch?
E
entanglement
Veja o código do Bezier Curve (ele usou um try/finally para forçar o fechamento dos arquivos. )
Não se esqueça: tudo que abriu, feche. Toalha molhada? Não é para largar em cima da cama e sim no cabide ou no varal.