# Mehrere (XML-)Datei aus einer ZIP-Datei auslesen



## Daniel_L (22. Okt 2008)

Hallo,

ich habe ein Problem beim Auslesen mehrerer Dateien aus einer Zip-Datei. Hier mein Code:


```
try {
                ZipInputStream zip = new ZipInputStream(new FileInputStream(fp));
                ZipEntry entry;
                
                while ((entry=zip.getNextEntry())!=null) {
                    String entryname = entry.getName();

                    if (entryname.equals("zknFile.xml") ||
                        entryname.equals("authorFile.xml") ||
                        entryname.equals("keywordFile.xml")) {
                        try {
                            SAXBuilder builder = new SAXBuilder();
                            Document doc = new Document();
                            doc = builder.build(zip);

                            if (entryname.equals("zknFile.xml")) dataObj.setZknData(doc);
                            if (entryname.equals("authorFile.xml")) dataObj.setAuthorData(doc);
                            if (entryname.equals("keywordFile.xml")) dataObj.setKeywordData(doc);
                        }
                        catch (JDOMException e) {
                            System.out.println("Fehler bei SaxBuilder");
                            e.printStackTrace();
                            Logger.getLogger(CLoadDialog.class.getName()).log(Level.SEVERE, null, e);
                        }
                    }
                }
                zip.close();
            }
            catch (IOException e) {
                System.out.println("Fehler bei NextEnry");
                e.printStackTrace();
                Logger.getLogger(CLoadDialog.class.getName()).log(Level.SEVERE, null, e);
            }
```

Eine einzelne XML-Datei auslesen, funktioniert wunderbar. Nun wollte ich aber 3 XML-Dateien aus der ZIP-Datei auslesen. Bei Google (und auch in diesem Forum) habe ich eben die Lösung mit dem "while getNextExtry() != null" gefunden. Aber sobald die erste XML-Datei eingelesen ist, gibt es einen Fehler, wenn die while-Schleife zum zweiten mal für die nächste Datei durchlaufen werden soll. Das sagt das Debug-Fenster:



> Fehler bei NextEnry
> java.io.IOException: Stream closed
> at java.util.zip.ZipInputStream.ensureOpen(ZipInputStream.java:44)
> at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:68)
> ...



Ich versteh allerdings nicht, was genau falsch ist? Die drei XML-Dateien habe ich zuvor problemlos folgendermaßen erstellt:


```
ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(data.getFilePath()));
            XMLOutputter out = new XMLOutputter();
            
            zip.putNextEntry(new ZipEntry("zknFile.xml"));
            out.output(data.getZknData(), zip);
            
            zip.putNextEntry(new ZipEntry("authorFile.xml"));
            out.output(data.getAuthorData(), zip);

            zip.putNextEntry(new ZipEntry("keywordFile.xml"));
            out.output(data.getKeywordData(), zip);
            
            zip.close();
```

Hat jemand eine Ahnung, wo der Fehler liegen könnte?

Vielen Dank und Gruß
Daniel


----------



## Daniel_L (22. Okt 2008)

Kurzer Nachtrag: Hier ist ein Beispiel (Code Sample 5) von Sun dazu...


----------



## Gast (22. Okt 2008)

Ich meine mich daran zu erinnern, das der SAX Parser irgendwie die FileHandle unter Windows nicht sauber verwaltet. Am besten googelst du mal in diese Richtung.


----------



## Daniel_L (22. Okt 2008)

Ach so, ich arbeite mit Mac OS X 10.5.5 (NetBeans 6.1) und JDK6. Aber ich google trotzdem mal, vielleicht finde ich was...


----------



## Daniel_L (27. Okt 2008)

Das Problem ist wohl, dass der SAXBuilder den Input-Stream automatisch schließt. D.h., ich müsste für jede XML-Datei die while-schleife neu durchlaufen. Hab das jetzt vorerst so gelöst, was auch funktioniert, aber wenig elegant aussieht:


```
ZipInputStream zipzkn = new ZipInputStream(new FileInputStream(fp));
                ZipEntry entryzkn;
                
                while ((entryzkn=zipzkn.getNextEntry())!=null) {
                    String entryname = entryzkn.getName();
 
                    if (entryname.equals("zknFile.xml")) {
                        try {
                            SAXBuilder builder = new SAXBuilder();
                            Document doc = new Document();
                            doc = builder.build(zipzkn);
                            dataObj.setZknData(doc);
                            break;
                        }
                        catch (JDOMException e) {
                            e.printStackTrace();
                            Logger.getLogger(CLoadDialog.class.getName()).log(Level.SEVERE, null, e);
                        }
                    }
                }
                zipzkn.close();
 
                // second step, retrieve author-data
                ZipInputStream zipauth = new ZipInputStream(new FileInputStream(fp));
                ZipEntry entryauth;
                
                while ((entryauth=zipauth.getNextEntry())!=null) {
                    String entryname = entryauth.getName();
 
                    if (entryname.equals("authorFile.xml")) {
                        try {
                            SAXBuilder builder = new SAXBuilder();
                            Document doc = new Document();
                            doc = builder.build(zipauth);
                            dataObj.setAuthorData(doc);
                            break;
                        }
                        catch (JDOMException e) {
                            e.printStackTrace();
                            Logger.getLogger(CLoadDialog.class.getName()).log(Level.SEVERE, null, e);
                        }
                    }
                }
                zipauth.close();
                
                // thir step, retrieve keyword-data
                ZipInputStream zipkw = new ZipInputStream(new FileInputStream(fp));
                ZipEntry entrykw;
                
                while ((entrykw=zipkw.getNextEntry())!=null) {
                    String entryname = entrykw.getName();
 
                    if (entryname.equals("keywordFile.xml")) {
                        try {
                            SAXBuilder builder = new SAXBuilder();
                            Document doc = new Document();
                            doc = builder.build(zipkw);
                            dataObj.setKeywordData(doc);
                            break;
                        }
                        catch (JDOMException e) {
                            e.printStackTrace();
                            Logger.getLogger(CLoadDialog.class.getName()).log(Level.SEVERE, null, e);
                        }
                    }
                }
                zipkw.close();
            }
```

Vielleicht setze ich noch mal eine äußere Schleife für die einzulesenen XML-Dateien um eine einzige innere while-schleife, sodass sich der Code-Block nicht ständig wiederholt...


----------

