日期:2014-05-20  浏览次数:21317 次

ZipException
文件流出现下面异常,请问是那里出了问题,怎么修正代码啊?

异常内容:
java.util.zip.ZipException:no current ZIP entry
at java.util.zip.ZipPutputStream.write(ZipOutputStream.java:267)
at java.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
at java.nio.cs.StreamEncoder.impClose(StreamEncoder.java:297)
at java.nio.cs.StreamEncoder.close(StreamEncoder.java:130)
at java.io.OutputStreamWriter.close(OutputStreamWriter.java:217)
at java.io.BufferedWriter.close(BufferedWriter.java:249)
at test.batch.DataGet.doWrierZip(DataGet.java:409)
at test.batch.DataGet.excute(DataGet.java:204)
at test.batch.DataGet.main(DataGet.java:1110)

其中倒数第三行指向代码:
boolean isFinish = csvWriter.write(path,zipFileName,csvFileName,DataRS,endtime)

调用writer方法:
public final boolean write(final String path,final String zipFileName,final String csvFileName,final ResultSet DataRS,final String endtime) throws Exception {
    ZipOutputStream zos=null;
    BufferedWriter bw =null;
    ZipEntry file=null;
    int judgeNum=1000;
    try {
        String filePath = path+ zipFileName;
        zos = new ZipPutputStream(New BufferedOutputStream(New FileOutputStream(filePath),Const.BUFFER_SIZE));
        bw = new BufferedWriter(New OutputStreamWriter(zos,"SJIS"));
        file = new ZipEntry(csvFileName);
        zos.putNextEntry(file);
        int timeJudgeCount=0;
        long countData=0;
        while(dataRS.next()){
            timeJudgeCount++;
            String data=getRowData(dataRS);
            bw.write(data);
            if(timeJudgeCount>judgeNum){
                bw.flush();
                Long nowtime=System.currentZTimeMillis();
                if(nowtime>= endtime){
                    zos.colseEntry();
                    bw.close();
                    bw=null;
                    return false;
                }
                timeJudgeCount=0;
            }
            countData++;
        }
        bw.flush();
        zos.closeEntry();
        bw,close;
        bw=null;
        Long nowtime=System.currentZTimeMillis();
        if(nowtime>= endtime){
            return false;
        }
        return true;
    } finally {
        if(bw!=null){
            zos.closeEntry();
            bw.close();
        }
    }


------解决方案--------------------
是不是数据没有,或者流关闭的问题。

/**
     * Writes an array of bytes to the current ZIP entry data. This method
     * will block until all the bytes are written.
     * @param b the data to be written
     * @param off the start offset in the data
     * @param len the number of bytes that are written
     * @exception ZipException if a ZIP file error has occurred
     * @exception IOException if an I/O error has occurred