Java 如何获取zip文件中文件夹中图像文件的大小
我有以下代码片段,用于检查给定的zip条目是否是一个正常工作的目录。还有一个额外的要求,我需要检查zip文件中文件夹中每个图像的大小(其大小不应大于10 MB)。 我读了一些文章,但找不到类似的场景 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 ->
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
可以正常工作-了解更多细节