Avatar billede bris Nybegynder
17. juni 2010 - 15:10 Der er 3 kommentarer og
1 løsning

Zip/Unzip - Size er altid -1 på zipentry

Jeg har en applikation som på et tidspunkt laver en zip fil, for måske senere at skulle unzippe den og vise hvad der findes inde i den. Den skal f.eks. også vise hvor stor det enkelte entry er inde i zip-filen.

Mit problem er, at ligegyldigt hvordan jeg prøver at zippe, så bliver størrelsen af mit zip-entry altid -1 når jeg læser igen. Det forstår jeg ikke, for selve indholdet, hvis jeg pakker det ud, virker som det skal.

Hvad gør jeg forkert? Se nedenstående kode:

import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public static void main(String[] args) throws IOException {
        try {
            String outputFile = "c:\\a.zip";
            int level = 9;
            FileOutputStream fout = new FileOutputStream(outputFile);
            ZipOutputStream zout = new ZipOutputStream(fout);
            zout.setLevel(level);
            ZipEntry ze = new ZipEntry("a.zip");
            File f = new File("c:\\temp\\splash.gif");
            ze.setSize(f.length());
            FileInputStream fin = new FileInputStream(f);
            zout.putNextEntry(ze);
            for (int c = fin.read(); c != -1; c = fin.read()) {
                zout.write(c);
            }
            fin.close();
            zout.close();
            File f1 = new File("c:\\a.zip");
            System.out.println("size: " + f1.length());
            testinput();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }

    private static void testinput() throws Exception {
        FileInputStream fin = new FileInputStream("C:\\a.zip");
        ZipInputStream zin = new ZipInputStream(fin);
        ZipEntry ze = null;
        while ((ze = zin.getNextEntry()) != null) {
            System.out.println("Unzipping " + ze.getName() + " - " + ze.getSize());
            FileOutputStream fout = new FileOutputStream(ze.getName());
            for (int c = zin.read(); c != -1; c = zin.read()) {
                fout.write(c);
            }
            zin.closeEntry();
            fout.close();
        }
        zin.close();
    }
Avatar billede arne_v Ekspert
17. juni 2010 - 16:08 #1
Docs siger:

public long getSize()

    Returns the uncompressed size of the entry data, or -1 if not known.

saa teknisk set virker det jo som dokumenteret - spoergsmaalet er hvorfor size ikke er kendt naar du har gemt den.
Avatar billede arne_v Ekspert
17. juni 2010 - 16:11 #2
Nu har jeg lavet et lille eksperiment.

Efter at zip entry er laest saa indeholder ze.getSize() det rigtige tal!

Mystisk. Men jeg tror ikke at du skal bekymre dig saa meget om det.
Avatar billede bris Nybegynder
18. juni 2010 - 08:03 #3
Vil du så høre noget endnu sjovere?.. Hvis du bruger et almindeligt zip program til at lave en zip fil, og prøver kun at pakke ud, så fungerer det som det skal :)

Jeg tror måske at jeg gør noget forkert når jeg zipper den ned..
Avatar billede bris Nybegynder
23. juni 2010 - 13:42 #4
Har fundet løsningen.

  FileInputStream fin = new FileInputStream("C:\\a.zip");
        ZipInputStream zin = new ZipInputStream(fin);
        ZipEntry ze = null;
        while ((ze = zin.getNextEntry()) != null) {
           
            zin.closeEntry();
System.out.println("looking at size for " + ze.getName() + " - " + ze.getSize());
}
           


Løsningen er, at man ikke behøver at læse selve det entry, som man har med at gøre. Man kan bare lukke det entry, og så kan man få størrelse at vide. Lidt strange, men who cares..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester