java.util.zip.DataFormatException: invalid distance too far back

本文探讨了解压WAR或JAR文件时遇到的java.util.zip.ZipException错误:invalid distance too far back。通过分析代码示例,指出问题可能源于PipedInputStream的使用方式,特别是当其声明与使用之间间隔过多代码或存在逻辑判断时。文章提供了详细的异常堆栈跟踪信息。

解压 war/jar文件时出现以下错误:
java.util.zip.ZipException: invalid distance too far back
at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.readFromInflater(ZipArchiveInputStream.java:478)
at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.readDeflated(ZipArchiveInputStream.java:443)
at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.read(ZipArchiveInputStream.java:384)
at java.io.InputStream.read(Unknown Source)
at org.apache.commons.compress.utils.IOUtils.copy(IOUtils.java:75)
at org.apache.commons.compress.utils.IOUtils.copy(IOUtils.java:56)
at com.xunge.AESFileEncoder$1.run(AESFileEncoder.java:149)
at java.lang.Thread.run(Unknown Source)
Caused by: java.util.zip.DataFormatException: invalid distance too far back
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Unknown Source)
at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.readFromInflater(ZipArchiveInputStream.java:476)
… 7 more

相关代码:

PipedInputStream pin = new PipedInputStream();
                    PipedOutputStream pout = new PipedOutputStream(pin);
                    new Thread(new Runnable() {
                        public void run() {
                            try {
                                IOUtils.copy(ais, pout);

                                pout.close();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }).start();

                    ArchiveInputStream inJar = new ArchiveStreamFactory()
                            .createArchiveInputStream(ArchiveStreamFactory.JAR,
                                    pin);

以上代码是没有问题,如果使用 pin 的代码和 pin 的声明代码中间隔了太多的代码就会产生此异常。具体没有做试验,也可能是有逻辑判断语句的原因。

### 关于 `java.util.zip.DataFormatException: invalid block type` 错误 当使用 Apache PDFBox 进行 PDF 文件处理时,如果遇到错误提示 `java.util.zip.DataFormatException: invalid block type`,这通常表明在解析压缩流的过程中出现了问题。具体来说,可能是由于以下原因之一: - 输入的 PDF 文件损坏或不完整[^1]。 - 使用的 PDFBox 版本存在已知缺陷。 - 部分特殊编码或加密方式未被当前版本支持。 #### 可能解决方案 以下是针对该问题的一些常见解决方法: 1. **验证输入文件** 确保所使用的 PDF 文件本身没有损坏。可以尝试打开并查看此文件是否能在其他 PDF 查看器中正常显示。如果文件无法正确加载,则可能需要重新获取原始文件。 2. **升级到最新版 PDFBox** 如果正在使用的 PDFBox 是旧版本(如 2.0.10),建议将其更新至最新的稳定版本。新版本修复了许多与数据格式异常相关的 bug,例如 `[PDFBOX-4227]` 中提到的距离参数过远的问题。 3. **调整内存配置** 增加 JVM 启动参数中的堆大小设置也可能有助于缓解某些情况下因资源不足引发的数据读取失败现象。例如,在启动应用程序时加入如下选项: ```bash -Xms512m -Xmx1g ``` 4. **捕获特定异常并记录日志** 编写代码时增加对潜在运行期异常的捕捉逻辑,并将详细的上下文信息保存下来以便后续分析。下面是一个简单的例子展示如何优雅地处理此类情况: ```java try { PDDocument document = PDDocument.load(new File("path/to/document.pdf")); // Further processing... } catch (IOException e) { System.err.println("Error occurred while loading the document."); e.printStackTrace(); } ``` 通过上述措施应该能够有效减少甚至完全消除由非法块类型引起的崩溃状况发生几率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值