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 Zitieren
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) Zitieren
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. Zitieren
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 Zitieren
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; } Zitieren
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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.