gpt4 book ai didi

Java Inflater 有时会无限循环

转载 作者:行者123 更新时间:2023-12-02 10:05:32 26 4
gpt4 key购买 nike

在我的应用程序中,我尝试使用 java 的 Inflater/Deflater 类来压缩/解压缩字节数组。这是我最初使用的部分代码:

   ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);  
byte[] buffer = new byte[1024];
while (!inflater.finished()) {
int count = inflater.inflate(buffer);
outputStream.write(buffer, 0, count);
}

然后,在我部署代码后,它会随机(非常罕见)导致整个应用程序挂起,当我进行线程转储时,我可以识别出一个挂起的线程

    at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:259)
- locked java.util.zip.ZStreamRef@fc71443
at java.util.zip.Inflater.inflate(Inflater.java:280)

这种情况并不经常发生。然后我到处搜索,发现它可能是在充气器中传递的一些空字节数据,并且 finish() 永远不会返回 true。

所以我使用了一种解决方法,而不是使用

while (!inflater.finished()) 

为了确定它是否完成,我使用了

while (inflater.getRemaining() > 0)

但这样的事又发生了。现在这让我想知道导致这个问题的真正原因是什么。充气器中不应该传递任何空数组,即使有,为什么 getRemaining() 方法没有打破 while 循环?有人可以帮忙吗?这真是让我烦恼。

最佳答案

由于同样的问题而感到困惑,我找到了此页面。

这是我的解决方法,它可能会有所帮助:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while (!inflater.finished()) {
int i = inflater.inflate(buffer);
if (i == 0) {
break;
}
byteArrayOutputStream.write(buffer, 0, i);
}

关于Java Inflater 有时会无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55366393/

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