Java 如何获取zip文件中文件夹中图像文件的大小

Java 如何获取zip文件中文件夹中图像文件的大小,java,zip,zipfile,ziparchive,zipinputstream,Java,Zip,Zipfile,Ziparchive,Zipinputstream,我有以下代码片段,用于检查给定的zip条目是否是一个正常工作的目录。还有一个额外的要求,我需要检查zip文件中文件夹中每个图像的大小(其大小不应大于10 MB)。 我读了一些文章,但找不到类似的场景 zip文件的示例结构与下面给出的结构类似,以及其中的文件夹和图像大小 XYZ.zip>023423>Bat1.jpg ->11MB XYZ.zip>023423>Bat2.jpg ->5MB XYZ.zip>023423>Bat3.jpg ->

我有以下代码片段,用于检查给定的zip条目是否是一个正常工作的目录。还有一个额外的要求,我需要检查zip文件中文件夹中每个图像的大小(其大小不应大于10 MB)。 我读了一些文章,但找不到类似的场景

zip文件的示例结构与下面给出的结构类似,以及其中的文件夹和图像大小

XYZ.zip>023423>Bat1.jpg ->11MB 
XYZ.zip>023423>Bat2.jpg ->5MB 
XYZ.zip>023423>Bat3.jpg ->11MB
XYZ.zip>023423>Bat4.jpg ->10MB
基于上述场景,在执行结束时,我应该能够获得Bat1和Bat3作为输出,因为它们的大小>10 MB。请告知

private void isGivenZipInFolderStructure(ExcelImportCronJobModel
     cronJob) {
            try {
                foldersInZip = new ArrayList<>();
                if(cronJob.getReferencedContent() !=null) {
                    final ZipInputStream zip = new ZipInputStream(this.mediaService.getStreamFromMedia(cronJob.getReferencedContent()));
                    ZipEntry entry = null;
                    while ((entry = zip.getNextEntry()) != null) {
                        LOG.info("Size of the entry {}",entry.getSize());
                        if(entry.isDirectory()) {
                            foldersInZip.add(entry.getName().split(BunningsCoreConstants.FORWARD_SLASH)[0]);
                        }
                    }
                }
            } catch (IOException e) {
                LOG.error("Error reading zip, e");
            }
        }
private void isGivenZipInFolderStructure(ExcelImportCronJobModel
克朗乔布){
试一试{
foldersInZip=newarraylist();
if(cronJob.getReferencedContent()!=null){
final ZipInputStream zip=new ZipInputStream(this.mediaService.getStreamFromMedia(cronJob.getReferencedContent());
ZipEntry条目=null;
而((entry=zip.getnextery())!=null){
LOG.info(“条目的大小{}”,entry.getSize());
if(entry.isDirectory()){
添加(entry.getName().split(BunningsCoreConstants.FORWARD_-SLASH)[0]);
}
}
}
}捕获(IOE异常){
LOG.error(“读取zip,e时出错”);
}
}

如注释中所述,从
ZipInputStream
读取时未设置
getSize
的值-与使用
ZipFile
时不同。但是,您可以尝试自己扫描流内容并监视每个条目的大小

此方法扫描作为InputStream传入的任何ZIP,这些ZIP可以从文件或其他下载源派生:

public static void scan(InputStream is) throws IOException {
    System.out.println("==== scanning "+is);
    ZipEntry ze;

    // Uses ByteArrayOutputStream to determine the size of the entry
    ByteArrayOutputStream bout = new ByteArrayOutputStream();

    long maxSize = 10_000_000L;
    try (ZipInputStream zis = new ZipInputStream(is)) {
        while ((ze = zis.getNextEntry()) != null) {
            bout.reset();
            long size = zis.transferTo(bout);
            System.out.println(ze.getName()
                                +(ze.isDirectory() ? " DIR" : " FILE["+size+"]")
                                +(size  > maxSize ? " *** TOO BIG ***":"")
                                );
            if (size > maxSize) {
                //  entry which is too big - do something / warning ...
            } // else use content: byte[] content = bout.toByteArray();
        }
    }
}
这种方法对于非常大的ZIP内容并不理想,但对于您的特定情况可能值得一试——有一个慢的解决方案总比没有好


如果在ZIP中有大的条目,您也可以考虑替换行<代码>长大小= ZIS.TeleTo(BUT);

调用您自己的方法,该方法不传输内容,但仍返回大小-类似于
InputStream.transferTo的实现,但注释掉
write()

,“返回输入数据的未压缩大小。”您好@MadProgrammer我确实打印了尺寸,您可以在mu snipper中看到,下面是我在控制台中得到的,我没有给出有效的尺寸。不确定我是否遗漏了什么。INFO[hybrisHTTP18][ExcelImportValidator]条目的大小-1 INFO[hybrisHTTP18][ExcelImportValidator]条目的大小0因此
-1
表示大小未知(根据文档),但
0
可能表示它是文件夹条目或未被正确压缩,我用一个包含多个目录和文件的zip文件进行了一次快速测试,没有任何问题啊,好吧,问题在于
ZipInputStream
,显然,如果你使用它,它会返回
-1
的大小,但是
ZipFile
可以正常工作-了解更多细节