Java 这个zip方法有什么问题?

Java 这个zip方法有什么问题?,java,zip,compression,Java,Zip,Compression,我有一个方法,它可以将5个文件打包。它生成的zip文件没有错误,但我无法打开它来检查内容。我试着给它发电子邮件,gmail说它不能发送损坏的文件。尝试在Windows中使用WinRAR打开会导致一个错误,说明: 存档文件的格式未知或已损坏 方法如下: private void zipTestFiles() throws FileNotFoundException, IOException { File[] filenames = fileDir.listFiles(fileNameFil

我有一个方法,它可以将5个文件打包。它生成的zip文件没有错误,但我无法打开它来检查内容。我试着给它发电子邮件,gmail说它不能发送损坏的文件。尝试在Windows中使用WinRAR打开会导致一个错误,说明:

存档文件的格式未知或已损坏

方法如下:

private void zipTestFiles() throws FileNotFoundException, IOException
{
    File[] filenames = fileDir.listFiles(fileNameFilter(Constants.PAGE_MON_FILENAME_FILTER));

    byte[] buf = new byte[1024];

    String outFilename = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separatorChar + Constants.PAGEMONITOR_ZIP;
    DeflaterOutputStream out = new DeflaterOutputStream(new BufferedOutputStream(new FileOutputStream(outFilename)));

    for (int i=0; i<filenames.length; i++)
    {
        FileInputStream in = new FileInputStream(filenames[i]);

        int len;
        while ((len = in.read(buf)) > 0)
        {
            out.write(buf, 0, len);
        }

        in.close();
        }
    out.close();
}
private void zipTestFiles()引发FileNotFoundException,IOException
{
File[]filenames=fileDir.listFiles(fileNameFilter(Constants.PAGE_MON_FILENAME_FILTER));
字节[]buf=新字节[1024];
字符串outFilename=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separatorChar+Constants.PAGEMONITOR\u ZIP;
DeflaterOutputStream out=新的DeflaterOutputStream(新的BufferedOutputStream(新的FileOutputStream(outFilename));
对于(int i=0;i 0)
{
out.write(buf,0,len);
}
in.close();
}
out.close();
}

您应该使用
ZipOutputStream
而不是
DeflaterOutputStream
。不要忘记创建条目。在编写实现之前,请阅读
ZipOutputStream
的javadoc

您应该使用
ZipOutputStream
而不是
DeflaterOutputStream
。不要忘记创建条目。在编写实现之前,请阅读
ZipOutputStream
的javadoc

尝试使用已经存在于Java中的ZipoutStream。DeflaterOutputStream只使用DEFLATE方法进行压缩,但不会自动放置ZIP头。

尝试使用Java中已经存在的ZipOutputStream。DeflaterOutputStream仅使用DEFLATE方法进行压缩,但不会自动放入ZIP头。

您是否尝试使用此方法仅压缩一个文件?ZIP文件是文件的DEFLATE表示形式,加上一些头。可能您的应用程序生成了前者,但错过了后者,因此会出现错误。我认为@AlexR的答案是正确的。你试过用它来压缩一个文件吗?压缩文件是你文件的压缩表示,加上一些标题。可能您的应用程序生成了前者,但错过了后者,因此会出现错误。我认为@AlexR的答案是正确的。谢谢Alex。实际上,我在周末使用ZipoutStream时遇到了问题,但是.setMethod()有问题(我在使用.setMethod(ZipoutStream.STORED)进行实验时不断发现CRC不匹配),所以我想试试DeflateOutputStream。一切都好了,谢谢亚历克斯。实际上,我在周末使用ZipoutStream时遇到了问题,但是.setMethod()有问题(我在使用.setMethod(ZipoutStream.STORED)进行实验时不断发现CRC不匹配),所以我想试试DeflateOutputStream。现在都在工作。