Warum packt er nicht alle Dateien?

S

Seichelm

Gast
Hallo,

bin gerade an einem Programmierbeleg und habe folgendes Problem:

Es handelt sich um ein Programm zum packen von JAR-Archiven.
Dazu werden die Dateien aus einem Ordner ausgelesen und in einer ArrayList gespeichert.

Java:
public void jarEintraege(String JARFile, ArrayList Files, JarOutputStream jos, byte[] buf, String inJARpath) {

        try {
            // Dateien werden eingelesen:
            for (int i = 0; i < Files.size(); i++) {
                final File f = new File((String) Files.get(i));

                // Falls die Datei ein Verzeichnis ist:
                if(f.isDirectory()) {
                    inJARpath = inJARpath + f.getName() + File.separator;
                    File[] files = f.listFiles();
                    ArrayList al = new ArrayList();
                    for(int a = 0; a < files.length; a ++) {
                        al.add(files[a].toString());
                    }

                    jarEintraege(JARFile, al, jos, buf, inJARpath);
                }
                else {
                    final FileInputStream fis = new FileInputStream(f);

                    // Einträge werden angelegt:
                    jos.putNextEntry(new JarEntry(inJARpath + entryName(f)));

                    // JAR-Einträge werden geschrieben:
                    int len;
                    while ((len = fis.read(buf)) >= 0) {
                        jos.write(buf, 0, len);
                    }
                    fis.close();
		}
            }
        }
        catch(IOException e) {}
        finally{
            try{
                jos.close();
            }
            catch(IOException ex) {}
        }

    }

Nun habe ich das Problem, sobald ein Ordner gepackt wird, wird keine weitere Datei gepackt.
Also sind alle Dateien aus dem Ordner in dem Archiv gepackt, jedoch fehlen diejenigen, welche direkt nach dem Ordner stehen.

Kann mir jemand helfen?

Vielen Dank im vorraus!
 
S

Seichelm

Gast
folgende Exception wird ausgelöst:

java.io.IOException: Stream closed
at java.util.zip.ZipOutputStream.ensureOpen(ZipOutputStream.java:70)
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:142)
at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:92)
at WriteJAR.jarEintraege(WriteJAR.java:155)
at WriteJAR.Write(WriteJAR.java:109)
at CreateJARStrg.archivPacken(CreateJARStrg.java:371)
at CreateJAR.btnArchActionPerformed(CreateJAR.java:565)
at CreateJAR.access$1000(CreateJAR.java:11)
at CreateJAR$11.actionPerformed(CreateJAR.java:362)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
 

Ebenius

Top Contributor
Naja - für ein Verzeichnis rufst Du die selbe Methode rekursiv auf. Beim rausspringen (eine Ebene runter im Stack) schließt Du den Strom und willst dann danach weiter drauf schreiben. Das geht natürlich nicht.

Das Close (oben in Zeile 37) ist daran schuld. Konzeptionell gehört es aber ohnehin nicht dort hin. Darum muss sich der Aufrufer kümmern. Die Regel ist ganz einfach: Wer den Strom erzeugt muss ihn schließen. Niemand sonst! Die Methode bekommt einen Strom, um darauf zu schreiben. Nicht um den Strom zu schließen; vielleicht will der Aufrufer ja noch mehr machen.

Ebenius
 
S

Seichelm

Gast
Habe nun einen funktionierenden Code gefunden:

Java:
public void jarEintraege(String JARFile, ArrayList Files, JarOutputStream jos, byte[] buf, String inJARpath) {

        String JARpfad = inJARpath;

        try {
            // Dateien werden eingelesen:
            for (int i = 0; i < Files.size(); i++) {
                final File f = new File((String) Files.get(i));

                // Falls die Datei ein Verzeichnis ist:
                if(f.isDirectory()) {
                    durchläufe = 1;

                    JARpfad = JARpfad + f.getName() + File.separator;
                    File[] files = f.listFiles();
                    ArrayList al = new ArrayList();
                    for(int a = 0; a < files.length; a ++) {
                        al.add(files[a].toString());
                    }
                    
                    jarEintraegeFuerOrdner(JARFile, al, jos, buf, JARpfad);

                    durchläufe = 0;
                }
                else {                    

                    final FileInputStream fis = new FileInputStream(f);

                    // Einträge werden angelegt:
                    jos.putNextEntry(new JarEntry(inJARpath + entryName(f)));

                    // JAR-Einträge werden geschrieben:
                    int len;
                    while ((len = fis.read(buf)) >= 0) {
                        jos.write(buf, 0, len);
                    }
                    fis.close();
		}
            }
        }
        catch(IOException e) { e.printStackTrace(); }
        finally{
            try{
                if(durchläufe == 0) jos.close();
            }
            catch(IOException ex) { ex.printStackTrace(); }
        }

    }

und diese Methode:

Java:
public void jarEintraegeFuerOrdner(String JARFile, ArrayList Files, JarOutputStream jos, byte[] buf, String inJARpath) {
            String JARpfad = inJARpath;

        try {
            // Dateien werden eingelesen:
            for (int i = 0; i < Files.size(); i++) {
                final File f = new File((String) Files.get(i));

                // Falls die Datei ein Verzeichnis ist:
                if(f.isDirectory()) {
                    durchläufe = 1;

                    JARpfad = JARpfad + f.getName() + File.separator;
                    File[] files = f.listFiles();
                    ArrayList al = new ArrayList();
                    for(int a = 0; a < files.length; a ++) {
                        al.add(files[a].toString());
                    }

                    jarEintraege(JARFile, al, jos, buf, JARpfad);

                    durchläufe = 0;
                }
                else {

                    final FileInputStream fis = new FileInputStream(f);

                    // Einträge werden angelegt:
                    jos.putNextEntry(new JarEntry(inJARpath + entryName(f)));

                    // JAR-Einträge werden geschrieben:
                    int len;
                    while ((len = fis.read(buf)) >= 0) {
                        jos.write(buf, 0, len);
                    }
                    fis.close();
		}
            }
        }
        catch(IOException e) { e.printStackTrace(); }
}


Jetzt besteht das Problem, dass zwar das Archiv korrekt gepackt wird, aber nach doppelklick auf die Datei die Anwendung nicht startet.
 

U2nt

Bekanntes Mitglied
Wird dabei auch eine Manifest datei mit dem Eintrag der Main Klasse erstellt? Habs mir jetzt net durchgelesen... Damit sich eine jar auf Doppelklick öffnet, muss via Manifest Datei festgelegt werden, in welche Klasse er einspringen soll.

Musst das ändern, dass der noch nen Ordner META-INF erstellt indem die MANIFEST.MF liegt, in welcher

Code:
Manifest-Version: 1.0
Main-Class: MeineMainKlasse

steht.
 
S

Seichelm

Gast
Das Manifest ist nicht das Problem.

Es kommt auch kein Fehler, wenn ich das JAR starte.

Es passiert einfach nichts und die Anwendung startet nicht.

Habt ihr eine Idee woran das liegen könnte?
 

Ebenius

Top Contributor
Was passiert denn, wenn Du die JAR-Datei über die Konsole mit [c]java -jar meinprogramm.jar[/c] aufrufst?

Ebenius
 
S

Seichelm

Gast
Viele Dank für den Tipp, es erscheint tatsächlich eine Exception.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unknown Source)
at JARarchiver.initComponents(JARarchiver.java:163)
at JARarchiver.<init>(JARarchiver.java:20)
at JARarchiver$31.run(JARarchiver.java:1351)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 

Ebenius

Top Contributor
Dann hast Du höchstwahrscheinlich Dein(e) Bild(er) nicht mit ins JAR gepackt, bzw. nicht an die selbe Stelle.

[c]jar -tf meinejardatei.jar[/c] … listet Dir den Inhalt des Archivs auf.

Ebenius
 
S

Seichelm

Gast
Habe das Archiv mit WinRAR geöffnet.

Der Pfad der Bilder in dem von Netbeans erstellten Archiv ist identisch mit dem Pfad des von meinem Programm erstellten Archives.

Merkwürdig ist, dass wenn ich in dem Manifest z.b. zwei Buchstaben einfüge und diese wieder lösche, das Programm startet.
Das Manifest wird quasi nicht verändert, aber das Programm läuft...
 
S

Seichelm

Gast
Der Pfad ist im Programm wie folgt angegeben:

btnOeffnen.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icons/magnifier_zoom_in.png")));

In dem Archiv befindet sich der Ordner unter dem Pfad:

./Icons/
 
S

Seichelm

Gast
OK, liegt wahrscheinlich nur an dem speziellen Fall.
Ansonsten arbeitet das Programm korrekt.

Vielen Dank für die Hilfe!
 
J

JohannisderKaeufer

Gast
Der Pfad ist im Programm wie folgt angegeben:

btnOeffnen.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icons/magnifier_zoom_in.png")));

In dem Archiv befindet sich der Ordner unter dem Pfad:

./Icons/

Wo befindet sich die Klasse auf der du getClass() aufrufst?

Der Pfad den du getResource mitgibst, bezieht sich nicht auf das Rootverzeichnis deines jars sondern auf den Pfad der Klasse auf der du getClass() aufrufst.

bspl. bei

foo.Bar.getClass().getResource("blup")

muß blup im Verzeichnis foo sein.

Hat die manifest die "obligatorische Leerzeile" am Ende der Datei?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Compiler-Fehler Compilierung in VM nicht erfolgreich Allgemeine Java-Themen 10
D WSDL-Aufruf funktioniert nicht mehr nach Umstieg auf Maven Allgemeine Java-Themen 4
H KNN Erkennt Zahl Nicht Allgemeine Java-Themen 7
W ICEpdf PDF-Dateien werden mit Java 21 nicht nicht mehr vollständig dargestellt Allgemeine Java-Themen 3
Zrebna Berechnung der Zeit funktioniert nicht wie erwartet: Date, GregorianCalendar Allgemeine Java-Themen 16
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
N nicht static und auch nicht new Allgemeine Java-Themen 3
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
G @PostConstruct Annotation nicht mehr gültig ? Allgemeine Java-Themen 7
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
izoards log4j2 will nicht.... Allgemeine Java-Themen 15
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
I serialVersionUID - explizit vergeben oder nicht? Allgemeine Java-Themen 6
MiMa Vorhandenes das nicht existiert?? Allgemeine Java-Themen 7
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
T Fremde Typen mockt man nicht? Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
D Twitch API mit HttpURLConnection läuft nicht? Allgemeine Java-Themen 0
M Test geht auf Travis und mit Github Action schief aber nicht lokal Allgemeine Java-Themen 3
R Threads Clip loop loopt nicht Allgemeine Java-Themen 2
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand JMS Messages nicht abgeholt Allgemeine Java-Themen 0
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
A Mp3 Player funktioniert nicht Allgemeine Java-Themen 0
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
W Javac nicht bei Installation installiert Allgemeine Java-Themen 9
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Java.exe exestiert, aber irgendwie auch nicht Allgemeine Java-Themen 11
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben