2016-12-12 2 views
0

Я бы очень благодарен вам за вход в сценарий ниже.Программно извлекать один конкретный файл из архива 7zip - Java - Linux

Требования: - У меня есть архив 7zip файл с несколькими тысячами файлов в нем - У меня есть приложение Java работает на Linux, который требуется для получения отдельных файлов из файла 7 зип

  • Я хотел бы получить файл из архива по его пути (например, my7zFile.7z/file1.pdf) без необходимости повторять все файлы в архиве и сравнивать имена файлов.

  • Прежде чем запускать поиск, мне не нужно извлекать все файлы из архива (несжатый архив - несколько ТБ).

Я посмотрел в 7zip Java Binding - специфический IInArchive класса, единственный метод, экстракт, кажется, работает с помощью индексного файла, а не с помощью имени файла:

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

вы знаете ли любые другие библиотеки, которые могли бы помочь мне в этом случае использования, или я не замечаю способ сделать это с помощью 7zip jbinding?

Спасибо

Уважения,

Tobi

ответ

1

К сожалению, API не обеспечивает достаточного удовлетворения всех ваших требований. Чтобы извлечь один файл, вам нужно пройти индекс архива. Упрощенный интерфейс к архиву делает это гораздо проще:

интерфейс ISimpleInArchive обеспечивает:

ISimpleInArchiveItem[] getArchiveItems() 

Что позволяет получить список элементов в архиве. Интерфейс ISimpleInArchiveItem предоставляет метод:

java.lang.String getPath() 

Следовательно, вы можете ходить по archiveItems сравнивающие на пути. Конечно, это противоречит вашим требованиям.

Однако обратите внимание, что это просматривает индексную таблицу и не извлекает файлы до тех пор, пока не будет запрошено.После того, как у вас есть товар, вы можете использовать:

ExtractOperationResult extractSlow(ISequentialOutStream SequentialOutStream) 

по предмету, который вы нашли, чтобы его извлечь.

Глядя на 7z file format (обратите внимание, что это не официальный сайт 7zip), информация заголовка находится в конце файла с заголовком подписи в начале файла, дающим смещение к началу заголовка Информация. Поэтому при условии, что привязки SevenZip будут написаны красиво, ваш поиск будет наиболее читаться в начале файла (SignatureHeader), чтобы найти смещение в разделе HeaderInfo, затем перейдите в раздел HeaderInfo, чтобы создать список файлов, необходимый в getArchiveItems() , Только после того, как у вас есть необходимый вам элемент, он вернется к индексу фактического потока для файла, который вы хотите извлечь (скорее всего, когда вы вызываете extractSlow).

Таким образом, хотя не все ваши требования выполнены, накладные расходы на поиск/сравнение требуется только для поиска информации заголовка архива.

0

После того, как я написал код для чтения из всех файлов и папок из архива. У меня была длинная файловая (текстовая)/иерархия папок внутри 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 (поиск по глубине). Вы найдете подробные примеры в Интернете.

Смежные вопросы