2010-05-04 5 views
6

Unter welchen Umständen würde java.util.zip.ZipFile.close() eine IOException werfen? Die Methodensignatur gibt an, dass sie ausgelöst werden kann, aber aus dem Quellcode scheint dort kein Platz zu sein, wo dies möglich ist, es sei denn, es handelt sich um systemeigenen Code. Welche Korrekturmaßnahmen könnten gegebenenfalls an dem Punkt ergriffen werden, an dem diese Ausnahme festgestellt wird?Wann löst java.util.zip.ZipFile.close() IOException?

Antwort

7

Vom API docs on ZipFile.close():

diese ZIP-Datei schließen, wird der gesamte Eingangs schließen vorher Ströme durch Anrufungen des getInputStream Methode zurückgegeben.

Und InputStream.close() wirft ein IOException, so ZipFile.close() hat es auch zu werfen. Nach den API docs for InputStream.close(), wirft es ein IOException „wenn ein I/O-Fehler auftritt“. Das ist nicht sehr beschreibend, aber es wirft ein breites Netz. Inputstreams aus dem Dateisystem darstellen Strömen kommen, Netzwerk, Speicher usw. Inputstreams können Puffer umfassen, die ausgespült werden müssen, Steckdosen, die geschlossen werden müssen, die Ressourcen, die freigegeben werden müssen, Sperren, die freigegeben werden müssen, usw. können IOExceptions geschehen aus einer Vielzahl von Gründen.

+0

Wenn die Ausnahme bei einem Aufruf von read() oder write() ausgelöst wird, kann ich verstehen, dass das Lesen oder Schreiben fehlgeschlagen ist. Aber wenn die Ausnahme auf close() geworfen wird, was ist fehlgeschlagen? –

1

Von Mann in der Nähe (2):

nicht den Rückgabewert der Nähe Kontrolle() ist eine häufige, aber dennoch ernsthafte Programmierfehler. Es ist durchaus möglich, dass Fehler bei einer vorherigen write (2) -Operation erst beim finalen close() gemeldet werden. Wenn der Rückgabewert beim Schließen der Datei nicht überprüft wird, kann dies zu einem Verlust von Daten führen. Dies kann insbesondere bei NFS und mit Datenträgerkontingent beobachtet werden.

+2

Während ein Nur-Lese-Stream zu schließen, IOs Java-Framework überprüfen kann nicht für das kann nicht werfen, da es nicht statisch vs. Schreibströme gelesen hat checked. – Joshua

0

Ich bin nicht sicher, aber ich denke, IOException wird ausgelöst, wenn eine der folgenden Ereignisse eintreten:

  • Die Zip-Datei von etwas/jemand außerhalb der Anwendung gelöscht.
  • Wenn das Laufwerk, das die ZIP-Datei enthält abgehängt/getrennt

Viel mehr Ereignisse der Grund sein könnte, aber das sind die einzigen zwei, die ich im Moment denken konnte.

+0

Warum aber verursacht eine dieser Bedingungen einen Fehler beim Schließen einer schreibgeschützten Zip-Datei? – EJP

+0

Ich habe nicht erwähnt, dass dies die einzigen Bedingungen für das Auslösen der Ausnahme sind. –

0

Die Dokumentation für ZipFile.close() sagt: vorher zurückzuStröme durch Anrufungen der getInputStream Methode

diese ZIP-Datei schließt, wird den gesamten Eingangs schließen.

Vermutlich führt die native Methode close das Schließen der InputStreams aus.

Die close Methode von InputStream hat IOException als eine geprüfte Ausnahme.

Die wahrscheinlichste Ursache ist ein nicht genügend Speicherplatz auf dem Dateisystem, wo die ZIP-Datei Fehler im zugrunde liegenden Dateisystem geschrieben wird. Wenn Sie die Ursache nicht identifizieren und nicht sofort umgehen können, können Sie dem Benutzer nur den Zustand melden.

+0

Wenn Sie einen 'InputStream' verwenden, lesen Sie *, nicht * schreiben *, so dass der Speicherplatz aufgrund einer geschriebenen ZIP-Datei unter den Umständen dieser Diskussion nicht die Ursache für eine IOException sein kann . – Asaph

+0

Danke, korrigiert. –