Ich habe derzeit ein plausibles Ressourcenleck in meiner Bibliothek aufgrund der Tatsache, dass ich eine ZipFile geöffnet halte, so dass der zurückgegebene InputStream für einen bestimmten ZipEntry nicht geschlossen ist. Schließen des zurückgegebenen InputStream schließt jedoch nicht den Rest der Zip-Datei, also bleibe ich dabei offen. Gibt es eine Möglichkeit, die Zip-Datei sicher zu schließen und den InputStream für die Rückgabe zu behalten?Bleibt ein ZipEntry bestehen, nachdem ein ZipFile geschlossen wurde?
5
A
Antwort
4
Hier ist die Implementierung von InputStream from ZipFile:
/*
* Inner class implementing the input stream used to read a
* (possibly compressed) zip file entry.
*/
private class ZipFileInputStream extends InputStream {
...
public int read(byte b[], int off, int len) throws IOException {
if (rem == 0) {
return -1;
}
if (len <= 0) {
return 0;
}
if (len > rem) {
len = (int) rem;
}
synchronized (ZipFile.this) {
ensureOpenOrZipException();
Beachten Sie den Aufruf an #ensureOpenOrZipException
.
Also die Antwort auf Ihre Frage ist leider nein, es gibt keine Möglichkeit, den Stream offen zu halten.
Was man stattdessen tun könnte, ist wickeln und die # Schließen auf der Input Haken Ihre Zip-Datei zu schließen:
InputStream zipInputStream = ...
return new InputStream() {
@Override
public int read() throws IOException {
return zipInputStream.read();
}
@Override
public void close() throws IOException {
zipInputStream.close();
zipFile.close();
}
}
Ein anderer Ansatz wäre es zu puffern:
InputStream myZipInputStream = ...
//Read the zip input stream fully into memory
byte[] buffer = ByteStreams.toByteArray(zipInputStream);
zipFile.close();
return new ByteArrayInputStream(buffer);
Offensichtlich hat Jetzt sind alle in den Speicher gegangen, also müssen Ihre Daten eine angemessene Größe haben.
Verwandte Themen
- 1. Datenaktualisierungen, die nicht bestehen, nachdem eine WPF-Anwendung geschlossen wurde
- 2. webkit - SVG-Animation Transformation bleibt bestehen, nachdem es nicht sollte
- 3. Django-Formulare: Ein deaktiviertes Feld bleibt zwischen den Validierungen bestehen
- 4. SQLEXCEPTION Operation nicht erlaubt, nachdem ResultSet geschlossen Fehler bestehen
- 5. C++ - Speicher beibehalten, nachdem App geschlossen wurde
- 6. Was passiert, nachdem ein Paket erfasst wurde?
- 7. Warum bleibt localStorage in Chrome nicht bestehen?
- 8. Wie erkennt man, wenn ein Windows Explorer Fenster geschlossen wurde?
- 9. Scroll-Position wiederherstellen, nachdem das mobile Menü geschlossen wurde
- 10. Schaltfläche zum Senden bleibt Farbe schweben, nachdem geklickt wurde
- 11. Ein * Suchalgorithmus bleibt stecken
- 12. Rufen Sie Click-Event-Dateieingabe auf, nachdem $ mdDialog geschlossen wurde
- 13. Firefox-Download-Popup bleibt nach der Profileinstellung in Selenium bestehen
- 14. FactoryGirl-Attribut, das nach (: create) gesetzt wurde, bleibt bestehen, bis es referenziert wird?
- 15. Fenster wird nicht wiederhergestellt, nachdem es geschlossen wurde
- 16. Benachrichtigung abbrechen, nachdem die Anwendung vom Hintergrund aus geschlossen wurde
- 17. Lokale Speichervariable löschen, nachdem die App geschlossen wurde. Abschnitt
- 18. activateIgnoringOtherApps und makeKeyAndOrderFront funktioniert nicht, nachdem NSWindow geschlossen wurde
- 19. Bootstrap: Wie man Video stoppt, nachdem das Modal geschlossen wurde
- 20. ValidationSummary bleibt sichtbar, nachdem Fehler korrigiert wurden?
- 21. Programm beenden, nachdem MessageBox geschlossen ist
- 22. Pyperclip bleibt nicht bestehen, wenn Skript beendet wird
- 23. Bleibt das Zugriffstoken einer Seite bestehen, wenn ich offline bin?
- 24. Select2 Dropdown-Menü bleibt bestehen nach Auswahl von DOM entfernt
- 25. Bleibt der WebView-Cache zwischen den Anwendungsdurchläufen bestehen?
- 26. JAVA ZipFile Einträge() -Methode sieht keine Verzeichnisse
- 27. Wie wird setUndcorated() aufgerufen, nachdem ein Frame sichtbar gemacht wurde?
- 28. Kann ein side_effect-Iterator simuliert werden, nachdem er erschöpft wurde?
- 29. Richten Sie einen Rückruf ein, nachdem eine Transaktion festgeschrieben wurde
- 30. Qt: Ausführen einer Aktion (Blättern), nachdem ein Widget hinzugefügt wurde
Das ist ein bisschen wie ein Hack, aber es funktioniert! –
Warum ist es ein Hack? Es ist eine einfache Kapselung des Zip #close. Ich fügte einen weiteren Ansatz hinzu, der mein erster Gedanke war, aber er verwendet einen Speicherpuffer, der für Sie möglicherweise nicht funktioniert. – Kong
Als ich den Code betrachtete, erkannte ich, dass 'getInputStream' nur einen InputStream zurückgibt, ich dachte, dass es genauer wäre. Es ist dann kein Hack! –