2011-04-13 4 views
1

이후에 작성된 데이터에 따라 jzlib 1.0.7에 확실한 ArrayOutOfBoundException을 생성하는 간단한 테스트 케이스가 있고 ZOutputStream의 동일한 인스턴스 이 있습니다.ZOutputStream.write()의 ArrayOutOfBoundException

스택 트레이스는 :

java.lang.ArrayIndexOutOfBoundsException: 587 
    at com.jcraft.jzlib.Tree.d_code(Tree.java:149) 
    at com.jcraft.jzlib.Deflate.compress_block(Deflate.java:691) 
    at com.jcraft.jzlib.Deflate._tr_flush_block(Deflate.java:897) 
    at com.jcraft.jzlib.Deflate.flush_block_only(Deflate.java:772) 
    at com.jcraft.jzlib.Deflate.deflate_slow(Deflate.java:1195) 
    at com.jcraft.jzlib.Deflate.deflate(Deflate.java:1567) 
    at com.jcraft.jzlib.ZStream.deflate(ZStream.java:133) 
    at com.jcraft.jzlib.ZOutputStream.write(ZOutputStream.java:102) 
    at com.jcraft.jzlib.JZLibTestCase.main(JZLibTestCase.java:51) 
     at JZLibTestCase.main(JZLibTestCase.java:28) 

문제는 매우 드물게 발생하고 jzlib에서 열린 ZOutputStream에 기록 된 데이터 subsequentially 에 따라 달라집니다.

이 문제를 해결하는 방법에 대한 힌트가 있습니까? 혹시 이것에 대해 들어 보셨습니까?

답변

1

JZlib에서 버그를 발견했을 수도 있습니다. 주변을 검색하는 동안 첨부 된 소스 및 데이터 파일로 게시물을 가지고있는 다른 장소를 발견했습니다. 당신이 잘못한 것처럼 보이지는 않습니다. 바이트 시퀀스를 ZOutputStream으로 스트리밍 할 수 있어야합니다.

JZlib을 사용하는 특별한 이유가 있습니까? 필자가 사용하는 두 가지 주된 이유는 Z_PARTIAL_FLUSH 모드 및 라이센스 지원입니다. 플러시 모드가 필요없고 Oracle JVM을 사용하고 있다면, 포함 된 DeflaterOutputStream을 사용해도됩니다. ZOuputStream에 대한 코드에서이를 대체하면 예외없이 작동합니다.

+0

예, 압축 할 데이터에 따라 분명히 jzlib의 버그입니까? 이미 JCraft에보고했습니다. –

0

jzlib를 사용하여 동료에게 묻는 구체적인 이유를 찾지 못했지만 멀티 프로세서 시스템의 JRE 1.4에서 java.util.zip somewhen을 사용하는 버그가있었습니다. 아무도 없었습니다. 구체적으로 말해 줄 수 있어요. 그때부터 우리는 오랫동안 좋은 일을해온 jzlib을 사용 해왔다. 아마 그것은 이미 고쳐 졌을 것입니다. 그럼에도 불구하고, java.util.zip을 사용하면 jzlib가 실패한 것과 같은 방식으로 간단한 테스트 데이터에서 작동합니다. 사실입니다.