要求在程序当中生成两个csv文件,然后将其合并在一个zip文件里输出目前是这样实现的:
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
FileOutputStream f = new FileOutputStream("c:\\test.zip");
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
ZipOutputStream zos = new ZipOutputStream(csum);
BufferedOutputStream out = new BufferedOutputStream(zos);
zos.setComment("A test of java zipping");

System.out.println("Writing file Father.java");

File tempFile = File.createTempFile("headerCSV", ".csv");
FileWriter fw = new FileWriter(tempFile);
        fw.write("aaa,bbb,ccc,ddd,eee,fff,ggg,hhh\r\n");
        fw.write("aa1,bb1,cc1,dd1,ee1,ff1,gg1,hh1\r\n");
        fw.write("aaa\r\n");
        fw.write("aa2,bb2,cc2,dd2,ee2,ff2,gg2,hh2\r\n");
        fw.close();
        BufferedReader in1 = new BufferedReader(new FileReader(tempFile));
zos.putNextEntry(new ZipEntry(tempFile.getName()));
int b;
while ((b = in1.read()) != -1) {
out.write(b);
}
tempFile.delete();
in1.close();
        
        File tempFile1 = File.createTempFile("DetailCSV", ".csv");
        FileWriter fw2 = new FileWriter(tempFile1);
        fw2.write("aaa,bbb,ccc,ddd,eee,fff,ggg,hhh\r\n");
        fw2.write("aa1,bb1,cc1,dd1,ee1,ff1,gg1,hh1\r\n");
        fw2.write("aaa\r\n");
        fw2.write("aa2,bb2,cc2,dd2,ee2,ff2,gg2,hh2\r\n");
        fw2.close();

        BufferedReader in2 = new BufferedReader(new FileReader(tempFile1));
zos.putNextEntry(new ZipEntry(tempFile1.getName()));
int c;
while ((c = in2.read()) != -1) {
out.write(c);
}
tempFile1.delete();
in2.close();

out.close();
}
结果是一个文件打开错误(估计是内容为空),而另一个文件里有两个文件的内容。另外,如何把临时文件名字当中的数字去掉?如DetailCSV1254.csv当中的1254是自动生成的

解决方案 »

  1.   

    首先,
    ZipOutputStream zos = new ZipOutputStream(csum);
    BufferedOutputStream out = new BufferedOutputStream(zos); 
    这两个你用反了,应该是
    BufferedOutputStream out = new BufferedOutputStream(csum);
    ZipOutputStream zos = new ZipOutputStream(out);其次,File.createTempFile就是会加一些数字来确定你的文件名,但是这个应该不会造成问题
    因为zos.putNextEntry(new ZipEntry(tempFile.getName()));里面的tempFile.getName()可以改成你想要的任何字符串作为文件名的啊