2011-08-12 45 views
2

我有一個的ZipFile和我想創建與在它的每個條目的偏移量/大小的陣列。這樣一來,C++層(JNI)就可以直接讀取這些子文件而不必提取它們。如何在Java中找到ZipFile條目的文件偏移量?

我可以使用entry.getCompressedSize()文件的壓縮後的大小,但我看不到任何東西,找出該zip中的文件的偏移量。

Enumeration<? extends ZipEntry> zipEntries = zipFile.entries(); 
while (zipEntries.hasMoreElements()) 
{ 
    ZipEntry zip = (ZipEntry)zipEntries.nextElement(); 
    //long offset = ? 
    long fileSize = zip.getCompressedSize(); 
} 

任何簡單的方法來得到這個?

+0

了什麼問題是你真的想解決?總的來說,這聽起來像一個奇怪的技術方法...否則我不知道如何做到這一點。 –

+0

我有一個使用Android NDK R4建立了一個項目,該項目並沒有允許本地代碼,以項目資產的直接訪問。我通過將偏移量/文件大小傳遞給本機代碼並覆蓋文件操作來解決此問題,以便使用文件中的開始/結束位置直接從資產文件加載值。由於我無法進入(nda)的原因,我現在需要閱讀額外的.zip文件,並且我沒有AssetFileDescriptor來獲取此信息。 –

+0

如果你不能找到一個解決方案,你仍然可以使用Java解壓和服務從臨時或(如果你敢不存儲數據的任何地方)內存中的文件內容。 –

回答

2

我讀過.entries()按照它們在文件中出現的確切順序返回的條目(不確定這是否指實際文件或標題條目。)假設情況如下解決問題:

Enumeration<? extends ZipEntry> zipEntries = zipFile.entries(); 
long offset = 0; 
while (zipEntries.hasMoreElements()) 
{ 
    ZipEntry entry = (ZipEntry)zipEntries.nextElement(); 
    long fileSize = 0; 
    long extra = entry.getExtra() == null ? 0 : entry.getExtra().length; 
    offset += 30 + entry.getName().length() + extra; 
    if(!entry.isDirectory()) 
    { 
     fileSize = entry.getCompressedSize(); 

     // Do stuff here with fileSize & offset 
    }  
    offset += fileSize; 
} 

這是適用於我的情況。唯一需要注意的是,根據ZIP壓縮規範,在所有zip文件中,文件的存儲順序與目錄中的順序完全不同。因爲在我的情況下,我控制了zip文件的構造,這不是問題,但如果您使用來自不受控源的zip文件,則此方法可能不起作用。

+0

詳細說明,偏移量包含30個字節的標準zip壓縮包信息+文件名長度+一些可能的額外操作系統特定標誌+數據本身。 要注意,我碰到了在那裏的Java用字節數組在文件中不正確地返回.getExtra()實際上不是一個錯誤。由於我控制了我的壓縮過程,我知道它的正確值爲零,所以我刪除了這個術語。值得注意的是,你需要做類似的事情。 –

相關問題