[Resolvido] Varredura de arquivos ZIP em Java

7 respostas
E

Bom dia,
Estou em um projeto que preciso pegar um zip e validar quantos arquivos TXT ou XML este zip possui, vi diversos artigos que fazem o unzip e a compressão, mas meu caso é a simples leitura da quantidade e tipo de arquivos que este zip possui, alguém já viu algo assim ou conhece algum frameworks que poderia me dar um note para isso?

Obrigado 8)

7 Respostas

E

http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipFile.html

Veja, em particular:
http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipFile.html#entries() e
http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipEntry.html

R
Framework? Não conheço, mas não acho que seja necessário. Pra iterar os entries de um zip é bem simples:
public static void main(String[] args) throws IOException{
		ZipFile zip = new ZipFile("meuArquivo.zip");
		
		Enumeration<? extends ZipEntry> enumeration = zip.entries();
		
		while(enumeration.hasMoreElements()){
			System.out.println(enumeration.nextElement().getName());
		}
	}
E

entanglement:
http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipFile.html

Veja, em particular:
http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipFile.html#entries() e
http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipEntry.html

Opa, estou vendo e aparentemente já vem desde o JDK 5, vlw, depois posto o código assim que terminar. :smiley:

E

De qualquer maneira, o formato de um arquivo .zip é relativamente simples. Eu tive de implementar a leitura de um diretório de arquivos .zip separados em disquetes, e obviamente isso não está implementado pelo Java mas está documentado.

E
Rodrigo Sasaki:
Framework? Não conheço, mas não acho que seja necessário. Pra iterar os entries de um zip é bem simples:
public static void main(String[] args) throws IOException{
		ZipFile zip = new ZipFile("meuArquivo.zip");
		
		Enumeration<? extends ZipEntry> enumeration = zip.entries();
		
		while(enumeration.hasMoreElements()){
			System.out.println(enumeration.nextElement().getName());
		}
	}

Isso mesmo, Obrigado a vc Sasaki e ao entanglement.

E

Cheguei a ver muitos tutoriais a respeito, mas como todos eles o povo descompactava e para o que eu quero não serviria, mas está ok, consegui obter as informações que preciso para a validação de alguns zips que enviam ao sistema que estou montando, obrigado.

E

Bom devido as ajudas consegui fazer uma versão alpha (ainda vou separar em métodos e fazer as validações que preciso, mas as informações que eu queria lendo o TXT e o XML que precisava já consegui, vou deixar esse código como o prometido caso um dia alguém precise fazer algo assim:

public class ZipUtil {

                public static void main(String[] args) throws Exception{
                               File file = new File("R:/meu.zip");
                               ZipFile zipFile = new ZipFile(file);
                               Enumeration<? extends ZipEntry> enumeration = zipFile.entries();
                               ZipEntry entry = enumeration.nextElement();
                               InputStream is = zipFile.getInputStream(entry);
                               byte[] buffer = new byte[is.available()];
                               is.read(buffer);
                               System.out.println(new String(buffer).split("\n").length);

                               entry = enumeration.nextElement();
                               SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
                               is = zipFile.getInputStream(entry);
                               buffer = new byte[is.available()];
                               is.read(buffer);
                               DocumentReader reader = new DocumentReader();
                               parser.parse(new ByteArrayInputStream(buffer), reader);
                               System.out.println(reader.contador);
                }

                private static class DocumentReader extends DefaultHandler {
                               private int contador = 0;
                               @Override
                               public void startElement(String uri, String localName, String qName,
                                                               Attributes attributes) throws SAXException {
                                               if(qName.equalsIgnoreCase("documento")){
                                               contador++;
                                               }
                               }
                }
}

Mais uma vez obrigado pela ajuda, incluindo do Saudate com a forma de contagem dentro do XML e do TXT. 8)

OBS: Isso é uma versão alpha, ainda tem muitas melhorias, apenas fiz uma poc para validar os dados que precisava, agora vou refazer de um modo mais performático e vai mudar bastante, mas esse foi o Norte que pedi e que me ajudou muito.

Criado 26 de março de 2013
Ultima resposta 26 de mar. de 2013
Respostas 7
Participantes 3