Tenho um arquivo zip em memória (bufferedInputStream), e preciso extrair seus arquivos para a memória, cada um em um byte[] do tamanho exato de cada arquivo extraído.
ZipInputStreamin=newZipInputStream(fileAsStream);ZipEntryarquivo=in.getNextEntry();byte[]fileContents=newbyte[(int)arquivo.getSize()];if(OKtoAdd()){try{//fileAsStream.read(fileContents);//passando o primeiro arquivo do zip para ser adicionado no resources in.read(fileContents,0,(int)arquivo.getSize());System.out.println(fileContentType);}catch(IOExceptione)...
Segue abaixo o código para extrair os arquivos para memória. A grande sacada é usar um ByteArrayOutputStream, basicamente. No programa abaixo estou colocando os arrays em um mapa indexados pelo nome do arquivo.
Antes de ir dormir, vale uma ressalva: este tipo de operação é meio ‘perigosa’, pois se colocar arquivos em memória é um caminho fácil para memory leaks, etc. Para testar esse programinha eu zipei um arquivo texto. Funcionou e por isso eu comentei as linhas que imprimiam o conteúdo do arquivo no final desta classe.
Falou,
importjava.io.ByteArrayOutputStream;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;importjava.util.zip.ZipEntry;importjava.util.zip.ZipInputStream;publicclassUnzipToMemory{publicstaticvoidmain(String[]args){Stringfilename=args[0];Map<String,byte[]>map=newHashMap<String,byte[]>();try{ZipInputStreamzis=newZipInputStream(newFileInputStream(filename));bytebuf[]=newbyte[100*1024];ZipEntryentry;while((entry=zis.getNextEntry())!=null){intread=0;ByteArrayOutputStreambaos=newByteArrayOutputStream();while((read=zis.read(buf,0,buf.length))!=-1){baos.write(buf,0,read);}baos.flush();map.put(entry.getName(),baos.toByteArray());baos.close();}zis.close();}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}// for (byte letra : map.get("teste.txt")){// System.out.print((char)letra);// }}}