Extração de arquivos para a memória

2 respostas
The_Toad

Olá a todos,

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.

Dei uma olhada no site da sun e montei um esboço:

ZipInputStream in = new ZipInputStream(fileAsStream);
ZipEntry arquivo= in.getNextEntry();
byte[] fileContents = new byte[(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 (IOException e)...

Mas isto não funcionou. Alguém pode me ajudar?

Obrigado de antemão,
Abraço!

2 Respostas

J

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,

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnzipToMemory {

	public static void main(String[] args) {
	
		String filename = args[0];
		Map<String, byte[]> map = new HashMap<String, byte[]>();
		try {
			ZipInputStream zis = new ZipInputStream(new FileInputStream(filename));
			byte buf[] = new byte[100 * 1024];
			ZipEntry entry;
			while ((entry = zis.getNextEntry()) != null) {
				int read = 0;
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				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 (FileNotFoundException e) {			
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
//		for (byte letra : map.get("teste.txt")){
//			System.out.print((char)letra);
//		}
	}
}
The_Toad

Funcionou perfeito, obrigado!

Criado 3 de janeiro de 2008
Ultima resposta 4 de jan. de 2008
Respostas 2
Participantes 2