生成一个空的zip文件java

时间:2012-06-13 20:27:14

标签: java zip

我目前正在编写一个可以创建zip文件的函数,该文件将用于其他功能。下面是我的函数代码:

public void createZip(){

        try{
            String outfile = this.filename + ".zip";
            //input file
            FileInputStream input = new FileInputStream(this.filename);
            //output file
            ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(outfile));
            //name the file inside the zip file
            System.out.println(this.filename);
            zip.putNextEntry(new ZipEntry(this.filename));

            byte[] buffer = new byte[this.BUFFER];
            int len;
            //copy the file to the zip
            while((len= input.read(buffer)) > 0){
                System.out.println(len);
                zip.write(buffer, 0, len);
            }
            zip.closeEntry();
            zip.flush();
            input.close();
            zip.close();
            this.filename += ".zip";
        }
        catch(IOException e){
            e.printStackTrace();
        }

    }

我试过调试,但我找不到这个问题的根源。该函数运行没有任何进一步的问题,但zip文件生成它是一个空的。

6 个答案:

答案 0 :(得分:6)

您必须在关闭输出流之前使用ZipOutputStream#closeEntry()关闭该条目,否则该条目永远不会被确认为已完全写入。

此外,ZipEntry的名称不能是整个路径;即,它应该是dog.png而不是C:\Users\Admin\Documents\dog.png。此问题将毫无例外地传递,并将导致文件中的数据直接压缩到zip中,而不是压缩为压缩文件。

答案 1 :(得分:2)

好吧,只是想知道为什么你传递一个文件名作为参数,如果你不在代码中使用它.. 因为您总是使用this.filename。这让我觉得你试图用一个你设置为对象状态的名称命名一个zip文件,因为你也在ZipEntry中使用相同的名称,试图在其中添加相同的拉链文件..因为ZipEntry必须指向现有文件,这就是为什么它出现空白。

希望它有所帮助。

答案 2 :(得分:2)

final static byte[] EmptyZip={80,75,05,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00};
public static void createEmptyZip(String path){
    try{
        FileOutputStream fos=new FileOutputStream(new File(path));
        fos.write(EmptyZip, 0, 22);
        fos.flush();
        fos.close();
    }catch (FileNotFoundException e){
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

答案 3 :(得分:0)

尝试在关闭之前使用zip.flush()来刷新缓冲区,尽管close应该刷新缓冲区。

同时验证this.filename。您有一个具有相同名称的本地变量。永远不会使用本地变量filename。 zip文件可能被写入不同于您期望的位置。

答案 4 :(得分:0)

@phillipe请试试这个

    public void createZip(String filename) {
    try {
        //input file
        FileInputStream input = new FileInputStream(filename);
        //output file
        ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(filename + ".zip"));
        //name the file inside the zip file
        zip.putNextEntry(new ZipEntry(filename));

        byte[] buffer = new byte[1024];
        int len;
        //copy the file to the zip
        while((len = input.read(buffer)) > 0) {
            System.out.println();
            zip.write(buffer, 0 , len);
        }
        zip.closeEntry();
        zip.flush();
        zip.close();
        input.close();
        filename += ".zip";
    } catch(IOException e) {
        e.printStackTrace();
    }
}

这些代码创建了一个zip文件,这也适用于我。 :)

答案 5 :(得分:0)

简单的解决方案。在没有文件分隔符的ZipEntry中创建一个手动目录。

zip.putNextEntry(new ZipEntry("LOG" + fileName));

而不是

zip.putNextEntry(new ZipEntry(fileName));

此处fileName = file.getAbsoluteFile();

首先在zip文件中创建LOG目录,然后在目录路径下创建fileNames。这样可以避免在zip文件中创建初始的空目录。