有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

压缩流操作得到错误“java”。util。拉链ZipException:标题检查不正确'

当我尝试使用流操作来压缩和解压缩字符串数据时,我遇到了一个奇怪的错误。 确切地说,控制台中的错误信息指向“充气输入流”。在我的“解压缩()”中读取()

java.util.zip.ZipException: incorrect header check
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:122)
at mytest.decorator.demo.CompressionDecorator.decompress(CompressionDecorator.java:98)

但是,我发现如果我在“compress()”中不使用流式操作也可以。因此,我认为问题在于流式操作。 到底怎么了?有人能帮我吗

非常感谢

我的代码如下:

private String compress(String strData) {
    byte[] result = strData.getBytes();
    Deflater deflater = new Deflater(6);
    
    boolean useStream = true;
    
    if (!useStream) {
        byte[] output = new byte[128];
        deflater.setInput(result);
        deflater.finish();
        int compressedDataLength = deflater.deflate(output);
        deflater.finished();

        return Base64.getEncoder().encodeToString(output);
    }
    else {
        ByteArrayOutputStream btOut = new ByteArrayOutputStream(128);
        DeflaterOutputStream dfOut = new DeflaterOutputStream(btOut, deflater);
        try {
            dfOut.write(result);

            dfOut.close();
            btOut.close();
            return Base64.getEncoder().encodeToString(result);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

private String decompress(String strData) {
    byte[] bts = Base64.getDecoder().decode(strData);
    ByteArrayInputStream bin = new ByteArrayInputStream(bts);
    InflaterInputStream infIn = new InflaterInputStream(bin);
    ByteArrayOutputStream btOut = new ByteArrayOutputStream(128);
    
    try {
        int b = -1;
        while ((b = infIn.read()) != -1) {
            btOut.write(b);
        }
      
        bin.close();
        infIn.close();
        btOut.close();

        return new String(btOut.toByteArray());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

共 (1) 个答案

  1. # 1 楼答案

    找到根本原因

    字节数组“结果”的内容未更改。因此,如果使用“result”则不起作用,因为字符串数据实际上没有被压缩

    正确的用法是“ByteArrayOutputStream”。“compress()”中的toByteArray(),如下所示:

    //btOut.close();
    //return Base64.getEncoder().encodeToString(result);
    
    return Base64.getEncoder().encodeToString(btOut.toByteArray());