Commons Compress с использованием 7z дает поток не в формате BZip2 - PullRequest
0 голосов
/ 06 мая 2018

У меня есть этот защищенный паролем архив 7z, который можно правильно открыть и распаковать только с помощью 7z. Но используя код ниже:

    byte[] PASSWORD = "secret".getBytes();
    String fileName = "r:/txt.7z";
    SevenZArchiveEntry entry;
    try (SevenZFile arch = new SevenZFile(new File(fileName), PASSWORD)) {
        while ((entry = arch.getNextEntry()) != null) {
            System.out.println(entry.getName());
        }
//      for (var e : arch.getEntries()) {
//          System.out.println(e.getName());
//      }
    }

вызывает это исключение:

Exception in thread "main" java.io.IOException: Stream is not in the BZip2 format
  at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.init(BZip2CompressorInputStream.java:252)
  at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.<init>(BZip2CompressorInputStream.java:134)
  at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.<init>(BZip2CompressorInputStream.java:112)
  at org.apache.commons.compress.archivers.sevenz.Coders$BZIP2Decoder.decode(Coders.java:254)
  at org.apache.commons.compress.archivers.sevenz.Coders.addDecoder(Coders.java:79)
  at org.apache.commons.compress.archivers.sevenz.SevenZFile.buildDecoderStack(SevenZFile.java:933)
  at org.apache.commons.compress.archivers.sevenz.SevenZFile.buildDecodingStream(SevenZFile.java:909)
  at org.apache.commons.compress.archivers.sevenz.SevenZFile.getNextEntry(SevenZFile.java:222)

Обратите внимание, что если вы раскомментируете цикл for и закомментируете цикл while, он фактически печатает (единственное) имя файла в архиве. getNextEntry вызывает исключение в формате BZip2.

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

У меня также есть xz-1.8.jar (org.tukaani.xz) в моем классе.

Я также пытался SevenZFile конструктор с SeekableByteBuffer, но появляется точно такое же исключение.

Есть какие-нибудь подсказки?

1 Ответ

0 голосов
/ 07 мая 2018

Благодарность за этот ответ должна достаться Стефану Бодевигу из Apache (см. https://issues.apache.org/jira/browse/COMPRESS-452, где я разместил отчет об ошибке), но я также включил его здесь на тот случай, если кто-нибудь попадет в ту же проблему. Оказывается, что байтовый массив, представляющий пароль, должен быть в кодировке UTF16-LE, так что на самом деле эту проблему решает следующий небольшой фрагмент:

byte[] PASSWORD = "secret".getBytes("UTF16-LE");

Конечно, нужно позаботиться о UnsupportedEncodingException. Спасибо Стефан!

...