我要用servlet实现一个将数据以csv文件格式导出,并且是打成zip包。
可是,如果我生成两个csv文件,第一个文件是空的,第二个文件才有数据,不知道是为什么。
请大家帮帮忙,谢谢!以下是主要代码
ZipOutputStream zout = new ZipOutputStream(sout);
BufferedWriter bw = null;
zout.putNextEntry(new ZipEntry("1.csv"));
String data = "1,2,3,4,5,6";
bw = new BufferedWriter(new OutputStreamWriter(zout));
bw.write(data); zout.putNextEntry(new ZipEntry("2.csv"));
data = "a,b,c,d,e,f,g";
bw = new BufferedWriter(new OutputStreamWriter(zout));
bw.write(data); bw.close();
zout.flush();
sout.flush();
zout.close();
sout.close();

解决方案 »

  1.   

    每个结束之后都要
    zout.closeEntry()
      

  2.   


    请问是在 bw.write(data); 之后吗?
    我这样试的,结果报 bw.close(); 一行有错,空指针异常。
      

  3.   

    改成下面:        ZipOutputStream zout = new ZipOutputStream(sout);
            BufferedWriter bw = null;
            zout.putNextEntry(new ZipEntry("1.csv"));
            String data = "1,2,3,4,5,6";
            bw = new BufferedWriter(new OutputStreamWriter(zout));
            bw.write(data);
            bw.close();
            zout.flush();
            sout.flush();
            
            zout.putNextEntry(new ZipEntry("2.csv"));
            data = "a,b,c,d,e,f,g";
            bw = new BufferedWriter(new OutputStreamWriter(zout));
            bw.write(data);        bw.close();
            zout.close();
            sout.close();
      

  4.   

    谢谢,不过这样改后,压缩包中只有第一个文件。
    当运行到第一个bw.close();时,下载对话框就已经弹出来了。后面的没有加到压缩包中。
      

  5.   

    已经解决 ZipOutputStream zout = new ZipOutputStream(sout);
            BufferedWriter bw = null;
            zout.putNextEntry(new ZipEntry("1.csv"));
            String data = "1,2,3,4,5,6\r\n";
            bw = new BufferedWriter(new OutputStreamWriter(zout));
            bw.write(data);
            bw.flush();        zout.putNextEntry(new ZipEntry("2.csv"));
            data = "a,b,c,d,e,f,g\r\n";
    //        bw = new BufferedWriter(new OutputStreamWriter(zout));
            bw.write(data);
            bw.close();        zout.flush();
            sout.flush();
            zout.close();
            sout.close();
      

  6.   

    用下面的代码(我测试过没有问题)://FileOutputStream sout = null;
    ZipOutputStream zout = null;
    BufferedWriter bw = null;try {
    //sout = new FileOutputStream("testdata/test1.zip");
    zout = new ZipOutputStream(sout);
    bw = new BufferedWriter(new OutputStreamWriter(zout));
    zout.putNextEntry(new ZipEntry("1.csv"));
    String data = "1,2,3,4,5,6";
    bw.write(data);
    bw.flush();
    zout.flush();

    zout.putNextEntry(new ZipEntry("2.csv"));
    data = "a,b,c,d,e,f,g";
    bw.write(data);
    bw.flush();
    zout.flush();
    }
    catch (Exception exp) {
    exp.printStackTrace();
    }
    finally {
    try {
    if (zout != null) {
    zout.close();
    }
    if (sout != null) {
    sout.close();
    }
    if (bw != null) {
    bw.close();
    }
    }
    catch (Exception exp) {
    exp.printStackTrace();
    }
    }
      

  7.   


    谢谢,这个应该没问题了,bw在中间不能close();