4

我目前正在编写一个函数,它将创建一个 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 文件是一个空的。

4

6 回答 6

9

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

此外,ZipEntry 的名称不能是整个路径;即,它应该dog.png代替C:\Users\Admin\Documents\dog.png. 这个问题会毫无例外地过去,并且会导致文件中的数据被直接压缩到 zip 中,而不是作为压缩文件进入 zip 中。

于 2012-06-13T20:36:02.547 回答
3
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();
    }

}
于 2013-10-03T07:40:33.813 回答
2

好吧,只是想知道如果您不在代码中使用文件名作为参数,为什么要传递它。因为您总是使用this.filename。这让我认为您正在尝试使用您设置为对象状态的名称来命名一个 zip 文件,并且由于您在 ZipEntry 中也使用相同的名称,因此它试图在其中添加相同的 zipper 文件.. 因为 ZipEntry 必须指向一个现有文件,这就是它出现空的原因。

希望能帮助到你。

于 2012-06-13T20:37:02.170 回答
0

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

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

代替

zip.putNextEntry(new ZipEntry(fileName));

这里fileName = file.getAbsoluteFile();

这将首先在 zip 文件中创建 LOG 目录,然后是带有目录路径的文件名。这避免了在 zip 文件中创建初始空目录。

于 2013-03-12T11:20:38.343 回答
0

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

还要验证 this.filename。您有一个同名的局部变量。从不使用局部变量文件名。zip 文件可能被写入到与您预期不同的位置。

于 2012-06-13T20:30:53.617 回答
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 文件,这对我来说也很有效。:)

于 2012-06-13T21:18:11.503 回答