tutorials.de Buch-Aktion 02/2012
Like Tree1Danke
  • 1 Beitrag von Thomas Darimont
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
3007
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.329
    Hallo,
    ich habe ein Zip-Programm geschrieben.
    Beim erstellen eines Zip-Archives kann man sich das Kompressionslevel auswählen. Wenn ich jetzt Dateien einem Archiv hinzufügen möchte, brauche ich das gleiche Kompressionslevel, wie beim Erstellen des Archivs, da das Programm sonst ne Exception auswirft. Ich weiß aber nicht wie ich rausbekommen soll mit welchem Kompressionslevel das Archiv komprimiert wurde.

    Kann mir bitte einer helfen oder hat jemand eine andere Idee
    Geändert von zerix (31.05.05 um 20:31 Uhr)
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo!

    Schau mal hier:
    Code :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.Enumeration;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipOutputStream;
     
    /**
     * @author Tom
     * 
     */
    public class ZipFileExample {
     
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
            File archiveFile = new File("e:/foo.zip");
            File file = new File("e:/tmp/bar.txt");
     
            addFileToArchive(file, archiveFile);
        }
     
        public static void addFileToArchive(File file, File archiveFile)
                throws Exception {
     
            File tmpFile = new File(String.valueOf(System.currentTimeMillis()));
     
            ZipFile zipSrc = new ZipFile(archiveFile);
     
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tmpFile));
     
            Enumeration srcEntries = zipSrc.entries();
            while (srcEntries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry) srcEntries.nextElement();
                zos.putNextEntry(entry);
     
                BufferedInputStream bis = new BufferedInputStream(zipSrc
                        .getInputStream(entry));
     
                while (bis.available() > 0) {
                    zos.write(bis.read());
                }
                zos.closeEntry();
     
                bis.close();
            }
     
            ZipEntry newEntry = new ZipEntry(file.getName());
            zos.putNextEntry(newEntry);
     
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                    file));
            while (bis.available() > 0) {
                zos.write(bis.read());
            }
            zos.closeEntry();
     
            zos.finish();
     
            zos.close();
     
            zipSrc.close();
     
            archiveFile.delete();
     
            tmpFile.renameTo(archiveFile);
     
        }
     
    }

    Gruß Tom
    SamReciter bedankt sich. 
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.329
    Da kommt leider der gleiche Fehler. Soweit ich erkenne ist das fast der gleiche Quelltext wie meiner, bis auf den BufferedInputStream, da hab ich nur nen InputStream

    Exception in thread "main" java.util.zip.ZipException: invalid entry compressed size (expected 1318 but got 1316 bytes)
    at java.util.zip.ZipOutputStream.closeEntry(Unknown Source)
    at ZipFileExample.addFileToArchive(ZipFileExample.java:46)
    at ZipFileExample.main(ZipFileExample.java:23)

    Ich weiß, es an unterschiedlichen Kompressionsraten liegt, aber ich weiß nicht wie ich raus bekommen soll, mit welcher Kompressionsrate ein Archiv komprimiert wurde. Oder geht das auch anders?
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo!

    Also bei mir funktionierts... unter Windows XP. Wenn ich mit Winzip 8.1 eine Datei mit maximaler Kompressionsrate packe und mit meinem Beispiel eine Textdatei hinzufüge klappt's einwandfrei.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.329
    Ich hab es gerade mal mit einer Evaluations Version von WinZip 9.0 und mit meinem Prog probiert und ich bekomme jedesmal den gleichen Fehler.
    Ich benutze auch Windows XP.
    Ich hab das ganze auch schon auf einem anderen Rechner probiert und da kommt auch der gleiche Fehler und viel falsch machen kann man da ja nicht.

    Trotzdem danke für deine Hilfe
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo!

    Ich hab das Beispiel nun mal mit Winzip 9.0 ausprobiert und es läuft einwandfrei durch...
    Ich erzeuge mit Winzip eine Archiv mit einer 2 kbyte großen Textdatei. Die Kompressionsrate setze ich dabei auf Maximum (portable). Anschließend füge ich über den Beispielcode eine 1 kbyte große Datei hinzu.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.329
    Klar, bei TXT oder ähnlichen Dateien ist es fast egal wie hoch die Kompressionrate eingestellt ist, weil sich da bei der kompression fast nie was ändert. Versuch es mal mit mehreren verschiedenen Dateien.
     

  8. #8
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo!

    Habs jetzt mal mit einem 36 MB jpeg Image versucht (liegt im foo.zip) und eine exe Datei hinzugefügt.

    Funktioniert jetzt einwandfrei
    Code :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipOutputStream;
     
    /**
     * @author Tom
     * 
     */
    public class ZipFileExample {
     
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
            File archiveFile = new File("e:/foo.zip");
            File file = new File("c:/tmp/Firefox Setup 1.0.3.exe");
     
            addFileToArchive(file, archiveFile);
        }
     
        public static void addFileToArchive(File file, File archiveFile)
                throws Exception {
     
            File tmpFile = new File(String.valueOf(System.currentTimeMillis()));
     
            ZipFile zipSrc = new ZipFile(archiveFile);
     
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tmpFile));
     
            byte[] buffer = new byte[32756];
            int len = 0;
     
            Enumeration srcEntries = zipSrc.entries();
            while (srcEntries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry) srcEntries.nextElement();
     
                ZipEntry newEntry = new ZipEntry(entry.getName());
     
                zos.putNextEntry(newEntry);
     
                InputStream is = zipSrc.getInputStream(entry);
     
                while ((len = is.read(buffer)) > 0) {
                    zos.write(buffer, 0, len);
                }
     
                zos.flush();
                is.close();
            }
     
            ZipEntry newEntry = new ZipEntry(file.getName());
            zos.putNextEntry(newEntry);
     
            InputStream is = new FileInputStream(file);
     
            long size = 0;
            while ((len = is.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
     
            zos.closeEntry();
            zos.finish();
            zos.close();
            zipSrc.close();
            archiveFile.delete();
            tmpFile.renameTo(archiveFile);
        }
     
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  9. #9
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.329
    Geil, es funktioniert.
    Könnteste mir bitte noch erklären woran es gelegen hat
     

  10. #10
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo!

    Man muss einfach einen neuen ZipEntry erzeugen, der so heißt wie der alte ...
    Code :
    1
    2
    
    ZipEntry newEntry = new ZipEntry(entry.getName());
    zos.putNextEntry(newEntry);
    Dabei darf man jedoch nicht die Werte für size und compressedSize übernehmen, da diese scheinbar neu berechnet werden und dann leicht von den vorherigen abweichen können.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  11. #11
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.329
    Ok, danke.
    Auf die Idee hätte ich auch mal kommen können
    Ich mach jetzt noch nen neuen Beitrag, vielleicht kannste mir da auch helfen
     

Ähnliche Themen

  1. Daten in Dateien löschen bzw. hinzufügen
    Von thekiller im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 24.01.11, 12:08
  2. Dateien dem Projekt hinzufügen
    Von Meronax im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 17.03.09, 08:19
  3. jar-Archiv Dateien einbinden
    Von The_Answer1985 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 01.10.07, 11:12
  4. Jar Archiv nach Manifest Dateien durchsuchen
    Von cHrIzMaStEr im Forum Java
    Antworten: 8
    Letzter Beitrag: 24.10.06, 16:40
  5. Gebrannten DvD Dateien hinzufügen
    Von Doofkatze im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 2
    Letzter Beitrag: 19.12.05, 16:45