2016-12-12 48 views
0

以編程方式從7zip中提取單個特定文件存檔 - Java - Linux

的要求: - 我對此非常有幾千文件的7zip壓縮包文件 - 我在Linux上運行的Java應用程序需要檢索來自7 zip文件的單個文件

  • 我想通過路徑(例如my7zFile.7z/file1.pdf)從檔案中檢索文件,而不必遍歷檔案中的所有文件並比較文件名。

  • 我想避免在運行搜索之前從存檔中提取所有文件(未壓縮的存檔是幾TB)。

我看看到7zip的Java綁定 - 特別是IInArchive類,唯一的提取方法似乎通過文件索引的工作,而不是通過文件名:

http://sevenzipjbind.sourceforge.net/javadoc/net/sf/sevenzipjbinding/IInArchive.html

你知道的任何其他庫可以幫助我用這個用例,或者我忽略了用7zip jbinding做這件事的方法嗎?

謝謝

親切的問候,

託比

回答

1

很遺憾,看起來API並不足以滿足您的所有要求。爲了提取單個文件,您需要遍歷歸檔索引。簡化的界面,歸檔,使這更簡單:

ISimpleInArchive接口提供:

ISimpleInArchiveItem[] getArchiveItems() 

讓您可以檢索歸檔項目的列表。 的ISimpleInArchiveItem接口提供的方法:

java.lang.String getPath() 

因此你可以走在路比較archiveItems。授予這是違反你的要求。

但是,請注意,此步驟只是索引表,在請求之前不會提取文件。一旦你有這個項目後,你可以使用:

ExtractOperationResult extractSlow(ISequentialOutStream SequentialOutStream) 

你發現的項目實際上提取它。

看着7z file format(注意這不是7zip的官方網站),頭文件信息全部在文件的末尾,在文件開頭的Signature頭部給出了頭部起始偏移量信息。如果提供的SevenZip綁定編寫得很好,您的搜索至多會讀取文件的開頭(SignatureHeader)以找到HeaderInfo部分的偏移量,然後遍歷HeaderInfo部分以構建getArchiveItems()中所需的文件列表。只有當您擁有需要的項目時,纔會將它移回到您要提取的文件的實際流的索引(最有可能在您調用extractSlow時)。

因此,雖然並非所有要求都得到滿足,但所需搜索/比較的開銷僅限於搜索存檔的標題信息。

0

有一次,我寫了一個代碼從一個zip文件中的所有文件和文件夾閱讀。我在zip文件中有一個很長的文件(文本)/文件夾層次結構。我不確定這是否會對你有所幫助。我分享代碼的骨架。

import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 

ZipFile zipFile = new ZipFile(filepath); // filepath of the zip file 
Enumeration<? extends ZipEntry> entries = zipFile.entries(); 

while (entries.hasMoreElements()) { 
    ZipEntry entry = entries.nextElement(); 
    if (entry.isDirectory()) { // found directory inside the zipFile 
     // write your code here 
    } else { 
     InputStream stream = zipFile.getInputStream(entry); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); 
     // write your code to read the content of the file 
    } 
} 

您可以修改代碼以在zip中找到您想要的文件。但我認爲你不能直接訪問該文件,而必須瀏覽zip歸檔文件的所有路徑。 請注意,,ZipFile以DFS(深度優先搜索)方式遍歷壓縮文件內的所有文件和文件夾。你會在網上找到詳細的相關例子。

相關問題