2015-10-20 4 views
4

Я хотел бы, чтобы просмотреть содержимое .7z без извлечения его с Java, поэтому я попытался с помощью Apache Commons Compress:Preview .7z содержание и вложенные папки без извлечения

public static void main(String[] args) { 
    try { 
     SevenZFile sevenZFile = new SevenZFile(new File("C://test.7z")); 
     SevenZArchiveEntry entry; 
     while ((entry = sevenZFile.getNextEntry()) != null) { 
      System.out.println("Name: " + entry.getName()); 
      System.out.println("Size : " + entry.getSize()); 
      System.out.println("--------------------------------"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Это работает, но я хотел бы также просматривать файлы в другой 7z или почтовый индекс из оригинального 7z:

test.7z 
--- file1.txt 
--- otherInner.7z 
    ---- innerFile1.txt 
    ---- innerFile2.txt 

есть среднее, чтобы сделать это без извлечения 7z? Спасибо за помощь.

+1

Я не уверен, но я считаю, что это не должно быть возможным, потому что, поскольку файл sub 7zip сжимается, поэтому 7zip необходимо распаковать его, чтобы проанализировать, что внутри. – jaudo

+0

Это тоже мое мнение, но я не был уверен ... спасибо за ваш ответ –

ответ

1

Вид. Вы имеете в виду без извлечения внешнего 7z? Да. без извлечения внутреннего 7z? №

Похоже, что Apache Commons SevenZ работает только с файловыми объектами, поэтому вам нужно как минимум извлечь внутренний файл 7z, чтобы затем декодировать его.

Как только у вас есть entry, вы хотите, чтобы вы могли прочитать байты из массива байтов для этой записи. Вы можете написать эти байты в файл (Temp), а затем создать новый объект SevenZFile разобрать, что ..

Этот код в основном взят из Apache Common Compress Examples page:

SevenZFile sevenZFile =... 
SevenZArchiveEntry entry... 

...found our entry we want... 
byte[] content = new byte[entry.getSize()]; 
LOOP UNTIL entry.getSize() HAS BEEN READ { 
    sevenZFile.read(content, offset, content.length - offset); 
} 

Теперь, когда мы имеем наше сжатые байты, хранящиеся в byte[], мы должны записать его в файл, а затем мы можем распаковать его, используя другой экземпляр SeventZFile.

Возможно, вы можете пропустить промежуточный байт [], а вместо этого читать и записывать непосредственно в файл temp, но в любом случае, вы должны где-то создать временный файл.

+0

Да dkatzel, он без извлечения внешнего И внутреннего 7z ... Спасибо за ваш подробный ответ –

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