Commons Compress с использованием 7z дает поток не в формате BZip2

У меня есть этот защищенный паролем архив 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 ответ

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

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

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

Другие вопросы по тегам