2016-06-29 13 views
5

Мне нужно открыть сжатый файл (zml, я не могу найти информацию об этом расширении), как 7zip делает это с помощью java.Декомпрессия файла, такого как 7zip с Java

У меня есть файл zml, если я его открываю с помощью 7zip, он запрашивает у меня пароль, затем я помещаю пароль и могу открыть файл.

Мне нужно сделать то же самое с java, может ли кто-нибудь дать мне совет для этого?

С уважением.

Juan

+2

привет. Я думаю, что привязки java 7zip - это, вероятно, то, что вы ищете: http://sevenzipjbind.sourceforge.net/index.html – trooper

+0

Спасибо, я собираюсь взглянуть. –

+0

Я нашел с свойствами файла 7zip, что файл был zip, поэтому я использую Zip4j. Я мог бы сгладить файл, следуя указаниям этого сообщения: https://stackoverflow.com/questions/11174851/how-to-use-zip4j-to-extract-an-zip-file-with-password-protection Спасибо всем для вашей помощи. –

ответ

3

на основе @trooper комментарий, я был в состоянии извлечь .7z файл, который был защищен паролем. Попробуйте следующий код. Вам нужно будет настроить свой путь класса с помощью 7-Zip-JBinding (http://sevenzipjbind.sourceforge.net/index.html). Этот код представляет собой модифицированную версию фрагментов кода найден в http://sevenzipjbind.sourceforge.net/extraction_snippets.html

import java.io.FileNotFoundException; 
import java.io.RandomAccessFile; 
import java.util.Arrays; 

import net.sf.sevenzipjbinding.ExtractOperationResult; 
import net.sf.sevenzipjbinding.IInArchive; 
import net.sf.sevenzipjbinding.ISequentialOutStream; 
import net.sf.sevenzipjbinding.SevenZip; 
import net.sf.sevenzipjbinding.SevenZipException; 
import net.sf.sevenzipjbinding.SevenZipNativeInitializationException; 
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream; 
import net.sf.sevenzipjbinding.simple.ISimpleInArchive; 
import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem; 

public class Extract { 
    public static void main(String[] args) throws SevenZipException, FileNotFoundException { 
     try { 
      SevenZip.initSevenZipFromPlatformJAR(); 
      System.out.println("7-Zip-JBinding library was initialized"); 
      RandomAccessFile randomAccessFile = new RandomAccessFile("YOUR FILE NAME", "r"); 

      IInArchive inArchive = SevenZip.openInArchive(null, // Choose format 
                   // automatically 
        new RandomAccessFileInStream(randomAccessFile)); 
      System.out.println(inArchive.getNumberOfItems()); 

      // Getting simple interface of the archive inArchive 
      ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface(); 

      System.out.println(" Hash | Size | Filename"); 
      System.out.println("----------+------------+---------"); 

      for (ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) { 
       final int[] hash = new int[] { 0 }; 
       if (!item.isFolder()) { 
        ExtractOperationResult result; 

        final long[] sizeArray = new long[1]; 
        result = item.extractSlow(new ISequentialOutStream() { 
         public int write(byte[] data) throws SevenZipException { 
          hash[0] ^= Arrays.hashCode(data); // Consume data 
          for (byte b : data) { 
           System.out.println((char) b); 
          } 
          sizeArray[0] += data.length; 
          return data.length; // Return amount of consumed 
               // data 
         } 
        }, "YOUR PASSWORD HERE"); 

        if (result == ExtractOperationResult.OK) { 
         System.out.println(String.format("%9X | %10s | %s", hash[0], sizeArray[0], item.getPath())); 
        } else { 
         System.err.println("Error extracting item: " + result); 
        } 
       } 
      } 

     } catch (SevenZipNativeInitializationException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
3

Если искать чистого раствора Java, вы можете использовать Apache Commons Compress, который также поддерживает чтение зашифрованных файлов.