首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZipOutputStream离开大小=-1

ZipOutputStream离开大小=-1
EN

Stack Overflow用户
提问于 2012-11-05 16:07:07
回答 2查看 2.8K关注 0票数 3

我正在用ZipOutputStream用非常标准的代码创建一个压缩文件。出于某种原因,当我将它作为ZipInputStream读回来时,ZipEntrysize=-1。文件名已正确存储在ZipEntry中。

(当我使用操作系统工具创建一个压缩文件,然后读回它时,大小是正确的,所以我认为问题出在ZipOutputStream,而不是ZipInputStream)。

上下文是一个Spring MVC控制器。

我做错了什么?谢谢。

代码如下:

代码语言:javascript
复制
// export zip file
String file = "/Users/me/Desktop/test.jpg";
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file+".zip");
ZipOutputStream zos = new ZipOutputStream(fos);
zos.putNextEntry(new ZipEntry("test.jpg"));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) > 0) {
    zos.write(buffer, 0, bytesRead);
}
zos.closeEntry();
zos.close();
fis.close();

// import same file
String file2 = "/Users/me/Desktop/test.jpg.zip";
FileInputStream fis2 = new FileInputStream(file2);
ZipInputStream zis = new ZipInputStream(fis2);
ZipEntry entry = zis.getNextEntry();
// here: entry.getSize() = -1, zip.buf is an array of zeros... 
// but if I unzip the file on my OS I see that the original file has been zipped...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-06 02:09:06

看起来entry.getSize()根本就不可靠:Why ZipInputStream can't read the output of ZipOutputStream?

上面的帖子提供了一个合适的解决方法。

票数 0
EN

Stack Overflow用户

发布于 2012-11-05 16:18:06

您必须从流中获取下一个条目,如下例所示:

http://www.roseindia.net/tutorial/java/corejava/zip/zipentry.html

当你手动设置大小时,它肯定会给你一个结果,就像你已经显示的"64527“一样。您最好看一下zip示例。他们会给你一个清晰的图像。还有:Create Java-Zip-Archive from existing OutputStream

尝试一下,就像这样:

代码语言:javascript
复制
        String inputFileName = "test.txt";
        String zipFileName = "compressed.zip";

        //Create input and output streams
        FileInputStream inStream = new FileInputStream(inputFileName);
        ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(zipFileName));

        // Add a zip entry to the output stream
        outStream.putNextEntry(new ZipEntry(inputFileName));

        byte[] buffer = new byte[1024];
        int bytesRead;

        //Each chunk of data read from the input stream 
        //is written to the output stream
        while ((bytesRead = inStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, bytesRead);
        }

        //Close zip entry and file streams
        outStream.closeEntry();

        outStream.close();
        inStream.close();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13228168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档