java 生成压缩包 解压时不可预料的压缩末端

public static boolean fileToZip(List<byte[]>bytes, HttpServletResponse response) throws IOException {

    String password="ctj";
    boolean flag = false;
    ByteArrayOutputStream byteTest = null;
    ZipOutputStream zos = null;
    try {
        byteTest= new ByteArrayOutputStream();
        zos  = new ZipOutputStream(byteTest);
        if(bytes!=null&&bytes.size()>0) {
            ByteArrayInputStream is=null;
            BufferedInputStream  bis =null;
            for(int i=0;i<bytes.size();i++){
                byte[] b=bytes.get(i);
                //zip实例
                ZipParameters parameters = new ZipParameters();

                //后缀可以更改的 zip文件内的名字
                parameters.setFileNameInZip(h.get(i)+".xml");

                // 压缩方式
                parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
                // 压缩级别
                parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
                //设置是否加密
                parameters.setEncryptFiles(true);
                parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
                parameters.setPassword(password.toCharArray());
                parameters.setSourceExternalStream(true);
                zos.putNextEntry(null,parameters);

                // 读取待压缩的文件并写进压缩包里
                 is= new ByteArrayInputStream(b);
                 bis = new BufferedInputStream(is);
                //zos.write(b);
                byte[] buf = new byte[1024];
                // 将字节从文件传输到ZIP文件
                int len=0;
                while ((len = bis.read(buf)) != -1) {
                    zos.write(buf, 0, len);
                }
                bis.close();// 记得关闭流
                is.close();
                zos.closeEntry();
            }
        }
    } catch (ZipException e) {
        e.printStackTrace();
    }finally {
        zos.close();
    }
    OutputStream ous = new BufferedOutputStream(response.getOutputStream());
    response.reset();
    response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("账套名字.zip", "UTF-8"));
    response.addHeader("Content-Length", "" + byteTest.size());
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setContentType("application/octet-stream");
    IOUtils.write(byteTest.toByteArray(),ous);
    ous.flush();
    ous.close();
    flag=true;
    return flag;
}

img

加一行清空缓存,强制输出的代码即可,代码如下:

 while ((len = bis.read(buf)) != -1) {
       zos.write(buf, 0, len);
 }
改为
 while ((len = bis.read(buf)) != -1) {
     zos.write(buf, 0, len);
}
zos.flush();  //添加该行代码