Hilfe! Skript kopiert Files nur ohne Inhalt!

stEEdZ

Mitglied
Hallo,
ich bin hier gerade ziemlich gefrustet!
Ich habe ein Skript dass aus einer Zip oder Jar Datei in einem anderem Jar-File den Inhalt kopiert und auf Platte legt.
Funktioniert soweit auch ganz gut...
Dachte ich zumindest, bis ich festgestellt habe, dass die Verzeichnis-Struktur und die Files zwar vorhanden sind, aber leider ohne Inhalt! :eek:

Woran kann das liegen?

Hier der Link zu meinem Skript: hier
Da habe ich ganz unten auch nochmal geschrieben was für ne Fehlermeldung ich bekomme!

Danke für die Hilfe
steedz
 
Ich hoffe mal, du hast den folgenden Teil inzwischen wieder aktiviert und zum laufen gebracht, denn sonst ist wohl offensichtlich dass die Files leer sind.

Code:
//  while ((len = bis.read(buffer)) > 0) {
//    bos.write(buffer, 0, len);
//  }
//
//  bos.flush();
//  bos.close();
//  bis.close();
 
ne, natürlich hab ich das nicht wieder eingebaut. :rolleyes:
Bekomm das einfach nicht zum Laufen so...
Warum bekomm ich die Fehler:
Code:
java.io.IOException: Stream closed
	at java.util.zip.ZipInputStream.ensureOpen(ZipInputStream.java:43)
	at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:67)
	at install.file.ZipArchiveExtractor.extractArchive(ZipArchiveExtractor.java:44)
	at install.file.SplashScreenMain.<init>(SplashScreenMain.java:39)
	at install.file.SplashScreenMain.main(SplashScreenMain.java:89)
	at install.file.Main.main(Main.java:10)

Das versteh ich nicht. :(
 
Zuletzt bearbeitet:
Ok, habe deine Methode extractArchive(...) mal etwas umgestellt.
Jetzt müsste es gehen.

Das 1. Problem war , dass du deine äusseren while-Schleife als Endlosschleife
implementiert hast, und dann halt eine Nullpointer flog, sobald es keine weiteren entries mehr gab.

Und das 2. Problem war, dass du deinen BufferedInputSteam geschlossen hast (welcher dann seinen ZipInputStream automatisch schliesst), obwohl der ZipInputStream zum durchabeiten des Zips noch gebraucht hast.

Auf jeden Fall sollte es nun so laufen.

Code:
	public void extractArchive(InputStream archive, File destDir) throws Exception {
        if (!destDir.exists()) {
            destDir.mkdir();
        }

        ZipInputStream quelle = new ZipInputStream(archive);
        BufferedInputStream bis = new BufferedInputStream(quelle);

        byte[] buffer = new byte[16384];
        int len;
        
        ZipEntry entries = quelle.getNextEntry();
        while (entries != null) {
            

            String entryFileName = entries.getName();

            File dir = buildDirectoryHierarchyFor(entryFileName, destDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            if (!entries.isDirectory()) {
                BufferedOutputStream bos = new BufferedOutputStream(
                        new FileOutputStream(new File(destDir, entryFileName)));

                while ((len = bis.read(buffer)) > 0) {
                    bos.write(buffer, 0, len);
                }
                bos.flush();
                bos.close();
             
            }
            entries = quelle.getNextEntry();
        }
        bis.close();
    }
 
Oh man! Jaaaa es klappt! :D

Tausend Dank dafür, auch für die Erklärung!
Mir ist das ganze tatsächlich klar geworden... :suspekt:
 
Korrekterweise sollte es trotzdem heißen:
while ((len = bis.read(buffer)) != -1) {

Denn die Doku sagt:
the number of bytes read, or -1 if the end of the stream has been reached.

Ist zwar unwahrscheinlich dass es mal 0 bytes zwischendurch sind, aber wer weiß ;-)
 
Zurück