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
, Спасибо Стефан!