[Java] Zip in Zip openen / uitlezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 11-09 20:27

Matis

Rubber Rocket

Topicstarter
Beste PRGers,

momenteel ben ik bezig een tooltje te schrijven dat onze softwarevrijgaves geautomatiseerd kan testen.

Veelal worden de installatiebestanden gezipt. Nu heb ik in Java een prima manier gevonden om een zip in te lezen en te kijken welke entries er in de ZipFile zitten. Echter kan het ook voorkomen dat er een zipje in de ZipFile zit. Zipception ;)
Nu probeer ik een manier te vinden om de inhoud van de gezipte zips uit te lezen.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    public boolean test()
    {
        try
        {
            ZipFile zipFile = new ZipFile(_filename);
            scanZip(zipFile);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    private boolean scanZip(final ZipFile zipfile)
    {
        for (Enumeration<? extends ZipEntry> entries = zipfile.entries(); entries.hasMoreElements();)
        {
            final ZipEntry zipentry = (ZipEntry) entries.nextElement();
            scanZipRecursive(zipfile, zipentry);
        }
        return true;
    }

    private boolean scanZipRecursive(final ZipFile zipfile, final ZipEntry zipentry)
    {
        System.out.printf("ZipEntry name %s \n", zipentry.getName());
        if (checkExt(zipentry.getName(), "zip") == true)
        {
            /* Hier wil ik dan weer de ZipEntry omzetten naar een ZipFile */
            scanZip(null);
        }
        return true;
    }

Nu heb ik geprobeerd om van de InputStream uit de zipfile.getInputStream(zipentry); een File (of ZipFile) te maken, maar dat lijkt niet te kunnen zonder de zip eerst uit te moeten pakken.
Tijdens mijn zoektocht binnen GoT kwam ik wel dit topic tegen: [Java] Open docx file uit zip file
Echter wil de TS van dat topic de een bestand (InputStream) parsen.

Weten jullie een manier om dit wel te realiseren; Desnoods via een File dat ik in memory kan opslaan. Zonder tussenkomst van het filesystem?

Thnx :)

Matis

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 12-09 15:31
Hetzelfde antwoord als in het gelinkte topic, gebruik een ZipInputStream.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 11-09 20:27

Matis

Rubber Rocket

Topicstarter
matthijsln schreef op woensdag 27 juni 2012 @ 14:39:
Hetzelfde antwoord als in het gelinkte topic, gebruik een ZipInputStream.
Hmm, waarschijnlijk heb ik heel de tijd tegen een InputStream zitten werken en niet tegen een ZipInputStream :$
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    private boolean scanZipRecursive(final ZipFile zipfile, final ZipEntry zipentry)
    {
        System.out.printf("ZipEntry name %s \n", zipentry.getName());
        if (checkExt(zipentry.getName(), "zip") == true)
        {
            try
            {
                ZipInputStream inputStream = new ZipInputStream(zipfile.getInputStream(zipentry));
                ZipEntry entry = inputStream.getNextEntry();
                while(entry != null)
                {
                    scanZipRecursive(zipfile, entry);
                    entry = inputStream.getNextEntry();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        return true;
    }

Bovenstaande lijkt inderdaad prima te doen wat ik wil. Dit werkt in ieder geval voor een zip in een zip :)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je code klopt niet, want je roept steeds getInputStream() aan op de originele zipfile, en niet op de zip die je momenteel aan het processen bent. Maar ja, die heeft dan ook geen ZipFile instance - de contents uit die zip komen direct uit de ZipInputStream die je geconstruct hebt.

[ Voor 31% gewijzigd door .oisyn op 27-06-2012 15:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 11-09 20:27

Matis

Rubber Rocket

Topicstarter
.oisyn schreef op woensdag 27 juni 2012 @ 15:54:
Je code klopt niet, want je roept steeds getInputStream() aan op de originele zipfile, en niet op de zip die je momenteel aan het processen bent. Maar ja, die heeft dan ook geen ZipFile instance - de contents uit die zip komen direct uit de ZipInputStream die je geconstruct hebt.
Precies en ik weet ook niet hoe ik een zip in zip in zip zou moeten aanpakken. Al zou misschien de ZipEntry de geheugenlocatie in de originele (top) zip vasthouden, waardoor je alsnog de inhoud van de 3e zip kunt zien.
Misschien maandag eens proberen :)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gewoon een kwestie van een ZipInputStream openen op je ZipInputStream, want die laatste wijst naar de data van de huidige ZipEntry in de zip. Je hebt uiteraard wel een tweede methode nodig, want de ZipFile is alleen valide voor de "buitenste" zip. Of je maakt niet eens een ZipFile voor de buitenste zip maar je werkt louter met ZipInputStream (die je dan opent op een FileInputStream)

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    private boolean scanZipRecursive(final InputStream stream, final ZipEntry zipentry) 
    { 
        System.out.printf("ZipEntry name %s \n", zipentry.getName()); 
        if (checkExt(zipentry.getName(), "zip") == true) 
        { 
            try 
            { 
                ZipInputStream inputStream = new ZipInputStream(stream); 
                ZipEntry entry = inputStream.getNextEntry(); 
                while(entry != null) 
                { 
                    scanZipRecursive(inputStream, entry); 
                    entry = inputStream.getNextEntry(); 
                } 
            } 
            catch (IOException e) 
            { 
                e.printStackTrace(); 
            } 
        } 
        return true; 
    }

[ Voor 96% gewijzigd door .oisyn op 27-06-2012 18:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1