java.util.zip.ZipException: переподписанное дерево динамических битов - PullRequest
1 голос
/ 16 июня 2010

Я сжимаю строку с помощью gzip, затем распаковываю результат, однако я получил следующее исключение, почему?

 output:
Exception in thread "main" java.util.zip.ZipException: oversubscribed dynamic bit lengths tree
 at java.util.zip.InflaterInputStream.read(Unknown Source)
 at java.util.zip.GZIPInputStream.read(Unknown Source)
 at Test.main(Test.java:25)
public class Test {
 public static void main(String[]args) throws IOException{
  String s="helloworldthisisatestandtestonlydsafsdafdsfdsafadsfdsfsdfdsfdsfdsfdsfsadfdsfdasfassdfdfdsfdsdssdfdsfdsfd";
  byte[]bs=s.getBytes();
  ByteArrayOutputStream outstream = new ByteArrayOutputStream();

  GZIPOutputStream gzipOut = new GZIPOutputStream(outstream);
  gzipOut.write(bs);
  gzipOut.finish();
  String out=outstream.toString();
  System.out.println(out);
  System.out.println(out.length());

  ByteArrayInputStream in = new ByteArrayInputStream(out.getBytes());
  GZIPInputStream gzipIn=new GZIPInputStream(in);
  byte[]uncompressed = new byte[100000];
  int len=10, offset=0, totalLen=0;
  while((len = gzipIn.read(uncompressed, offset, len)) >0){ // this line
   offset+=len;
   totalLen+=len;
  }

  String uncompressedString=new String(uncompressed,0,totalLen);
  System.out.println(uncompressedString);
 }
}

1 Ответ

8 голосов
/ 16 июня 2010

Согласно этой странице , вероятной причиной является то, что ZIP-файл, который вы пытаетесь прочитать, поврежден.(Я знаю, что это не совсем соответствует вашим обстоятельствам ... но я уверен, что сообщение об исключении является ориентировочным.)

В вашем случае проблема заключается в том, что вы конвертируете поток gzip избайтовый массив в строку, а затем обратно в байтовый массив.Это почти наверняка операция с потерями, приводящая к повреждению потока GZIP.

Если вы хотите преобразовать произвольный байтовый массив в строковую форму и обратно, вам нужно будет использовать один из форматов кодирования строки, предназначенных для этого.цель;например, base64.

В качестве альтернативы просто измените это:

    String out = outstream.toString();
    ByteArrayInputStream in = new ByteArrayInputStream(out.getBytes());

на это:

    byte[] out = outstream.toByteArray();
    ByteArrayInputStream in = new ByteArrayInputStream(out);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...