Devilmarkus Geschrieben 10. Januar 2009 Geschrieben 10. Januar 2009 (bearbeitet) Hallo, wie kann ich die in einigen ZIP-Archiven enthaltene 'file_id.diz' Datei umgehen beim einlesen einer ZIP-Datei? Hier mein Code zum Einlesen: public InputStream openFile(String name) throws Exception { System.out.println("File: " + name); InputStream result; try { result = new URL(applet.getCodeBase(),name).openStream(); } catch(Exception e) { result = new FileInputStream(name); } if (name.toLowerCase().endsWith(".zip")) { ZipInputStream str = new ZipInputStream(result); str.getNextEntry(); result = str; } return result; } Wer kann mir nun sagen, wie ich erkennen kann, ob eine 'file_id.diz' Datei in dem ZIP ist, und wie ich diese umgehen kann? Beispiel: in dem ZIP 'test.zip' sind enthalten: - file_id.diz - test.dsk Nun möchte ich, dass nur das 'test.dsk' gelesen wird. MfG Markus Bearbeitet 10. Januar 2009 von Devilmarkus
smx Geschrieben 11. Januar 2009 Geschrieben 11. Januar 2009 Hallo, eine Möglichkeit wäre die folgende: public static ArrayList<ZipEntry> readZip(String path) throws IOException { ZipInputStream zis = new ZipInputStream(new FileInputStream(path)); ZipEntry entry; ArrayList<ZipEntry> entries = new ArrayList<ZipEntry>(); while((entry = zis.getNextEntry()) != null) { if(!entry.getName().endsWith("file_id.diz")) entries.add(entry); } return entries; } } ZipInputStream (Java 2 Platform SE v1.4.2) ZipEntry (Java 2 Platform SE v1.4.2)
Devilmarkus Geschrieben 11. Januar 2009 Autor Geschrieben 11. Januar 2009 Hallo, eine Möglichkeit wäre die folgende: public static ArrayList<ZipEntry> readZip(String path) throws IOException { ZipInputStream zis = new ZipInputStream(new FileInputStream(path)); ZipEntry entry; ArrayList<ZipEntry> entries = new ArrayList<ZipEntry>(); while((entry = zis.getNextEntry()) != null) { if(!entry.getName().endsWith("file_id.diz")) entries.add(entry); } return entries; } } ZipInputStream (Java 2 Platform SE v1.4.2) ZipEntry (Java 2 Platform SE v1.4.2) Klingt logisch... Nur: Wie implementiere ich das nun in meinen Code? ich benötige als 'result' einen java.io.InputStream.
Devilmarkus Geschrieben 11. Januar 2009 Autor Geschrieben 11. Januar 2009 (bearbeitet) Habe es herausgefunden: if (name.toLowerCase().endsWith(".zip")) { ZipEntry entry; ZipInputStream str = new ZipInputStream(result); while((entry = str.getNextEntry()) != null) { System.out.println("Reading " + entry.getName()); if(!entry.getName().toLowerCase().endsWith(".diz")) return str; } } Danke für die Hilfe. Bearbeitet 11. Januar 2009 von Devilmarkus
smx Geschrieben 11. Januar 2009 Geschrieben 11. Januar 2009 Hallo, zum Beispiel indem du ZipFile anstatt ZipInputStream verwendest. Du bekommst so allerdings nur die erste Datei geliefert, insofern diese nicht file_id.diz heißt, ansonsten null. public InputStream readZip(String path) throws IOException { ZipFile zip = new ZipFile(path); ZipEntry entry; while(zip.entries().hasMoreElements()) { if(!(entry = zip.entries().nextElement()).getName().endsWith("file_id.diz")) return zip.getInputStream(entry); } return null; }
smx Geschrieben 11. Januar 2009 Geschrieben 11. Januar 2009 Kein Problem, vergiss nicht die Streams wieder zu schließen, ansonsten könnte es zu Problemen kommen. Am besten immer in einem finally-Block.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden