使用ColdFusion解压缩64位zip文件

时间:2013-02-26 16:49:16

标签: java coldfusion zip zipinputstream apache-commons-compress

我使用java.util.zip.ZipFile使用ColdFusion解压缩大文件。但是,我现在收到此错误:“无效的CEN标题(错误的签名)”。

我发现一条帖子显示这与zip 64位格式有关,我可以使用java.util.zip.ZipInputStream来处理它。但是,我无法解决这个错误:“您试图取消引用类型类型的标量变量[B作为具有成员的结构。”这是由这一行引起的:

bos = createObject("java","java.io.BufferedOutputStream").init(fos,buffer.length);

非常感谢任何帮助!

这是我的代码

    fis = createObject("java","java.io.FileInputStream").init(zipFilePath);
    bis = createObject("java", "java.io.BufferedInputStream").init(fis);
    zis = createObject("java", "java.util.zip.ZipInputStream").init(bis);

    cnt=0;
    while(1==1){
        cnt++;
        entry = zis.getNextEntry();
        if (isNull(entry))
        {
            writeOutput("done"&now());
            break;
        }

        nm = entry.getName();

        lenPth = len(nm) - len(getFileFromPath(nm));

        if (lenPth) {
            pth = outputPath & left(nm, lenPth);
        } else {
            pth = outputPath;
        }

        if (NOT directoryExists(pth)) {
            fil = createObject("java", "java.io.File");
            fil.init(pth);
            fil.mkdirs();
        }

        byteClass = createObject("java", "java.lang.Byte").TYPE;
        buffer = createObject("java","java.lang.reflect.Array").newInstance(byteClass, 2048);

        fos = createObject("java","java.io.FileOutputStream").init(outputPath & nm);
        bos = createObject("java","java.io.BufferedOutputStream").init(fos,buffer.length);

            while(1==1) {
                size = zis.read(buffer, 0, buffer.length);
                if(size == -1)
                    break;
                bos.write(buffer, 0, size);
            }
            bos.flush();
            bos.close();



    }

    zis.close();
    fis.close();

来源:

1 个答案:

答案 0 :(得分:2)

传递ArrayLen( Buffer )代替buffer.length将解决错误。

bos = createObject("java","java.io.BufferedOutputStream").init(fos,arrayLen(buffer));

您还可以使用getLength( array )的{​​{1}}方法,但与使用java.lang.reflect.Array

相比,创建其他实例似乎有些过分