gpt4 book ai didi

java - 使用 7z 的 Commons 压缩给出的 Stream 不是 BZip2 格式

转载 作者:行者123 更新时间:2023-11-30 06:11:11 25 4
gpt4 key购买 nike

我有这个受密码保护的 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 循环,它实际上会打印存档中的(唯一)文件名。触发BZip2格式异常的是getNextEntry

我无法找到有关此问题的任何错误报告。当然,我认为这可能是错误的密码,所以我将其更改为一些垃圾,以查看结果,但随后它给出了不同的异常,并在消息中建议,可能密码不正确。所以,看起来密码肯定是正确的,但我无法解压缩文件。

我的类路径中还有 xz-1.8.jar (org.tukaani.xz)。

我还尝试了带有 SeekableByteBufferSevenZFile 构造函数,但弹出了完全相同的异常。

有什么线索吗?

最佳答案

这个答案的功劳应该归功于 Apache 的 Stefan Bodewig(请参阅 https://issues.apache.org/jira/browse/COMPRESS-452 我放置错误报告的位置),但我也将其放在这里,以防有人遇到同样的问题。事实证明,表示密码的字节数组应该采用 UTF16-LE 编码,因此真正解决问题的是这个小片段:

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

当然,我们必须处理UnsupportedEncodingException。谢谢斯特凡!

关于java - 使用 7z 的 Commons 压缩给出的 Stream 不是 BZip2 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com