本文介紹了ZipEntry在Zipfile關閉后仍然存在嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我當前在我的庫中有一個看似合理的資源泄漏,這是因為我打開了一個zipfile文件,因此返回的某個ZipEntry的InputStream不會關閉。然而,關閉返回的InputStream并不會關閉Zipfile的其余部分,因此我只能讓它保持打開狀態。有沒有辦法安全地關閉Zipfile并保留InputStream以供返回?
推薦答案
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();
注意對#ensureOpenOrZipException
的調用。
很遺憾,您的問題的答案是否定的,無法保持流的打開狀態。
您可以做的是包裝并掛鉤InputStream上的#Close以關閉您的壓縮文件:
InputStream zipInputStream = ...
return new InputStream() {
@Override
public int read() throws IOException {
return zipInputStream.read();
}
@Override
public void close() throws IOException {
zipInputStream.close();
zipFile.close();
}
}
另一種方法是緩沖它:
InputStream myZipInputStream = ...
//Read the zip input stream fully into memory
byte[] buffer = ByteStreams.toByteArray(zipInputStream);
zipFile.close();
return new ByteArrayInputStream(buffer);
顯然,這些數據現在都已進入內存,因此您的數據需要具有合理的大小。
這篇關于ZipEntry在Zipfile關閉后仍然存在嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,