当前位置: 首页 > 知识库问答 >
问题:

用于嵌套ZIP文件处理的Java实用程序库

公良鸿畅
2023-03-14

我知道Oracle在他们的网站上提到了ZIP/GZIP文件压缩器/解压缩器方法。但我有一个场景,我需要扫描并找出是否涉及任何嵌套的ZIP/RAR。例如,以下情况:

-MyFiles.zip
   -MyNestedFiles.zip
        -MyMoreNestedFiles.zip
           -MoreProbably.zip
        -Other_non_zips
   -Other_non_zips
-Other_non_zips

我知道apache commons压缩包和java。util。zip是wideley使用的包,commons compress实际上是为了满足java中缺失的功能。util。zip,例如,在做拉链动作时进行一些角色设置。但我不确定的是,通过嵌套zip文件递归的实用程序以及上面提供的答案都不是很好的例子。我尝试了以下代码(来自Oracle博客),但正如我所怀疑的,嵌套目录递归失败,因为它根本找不到文件:

public static void processZipFiles(String pathName) throws Exception{
        ZipInputStream zis  = null;
        InputStream  is = null;
        try {
          ZipFile zipFile = new ZipFile(new File(pathName));
          String nestPathPrefix = zipFile.getName().substring(0, zipFile.getName().length() -4);
          for(Enumeration e = zipFile.entries(); e.hasMoreElements();){
           ZipEntry ze = (ZipEntry)e.nextElement();
            if(ze.getName().contains(".zip")){
              is = zipFile.getInputStream(ze);
              zis = new ZipInputStream(is);
              ZipEntry zentry = zis.getNextEntry();

              while (zentry!=null){
                  System.out.println(zentry.getName());
                  zentry = zis.getNextEntry();
                  ZipFile nestFile = new ZipFile(nestPathPrefix+"\\"+zentry.getName());
                  if (zentry.getName().contains(".zip")) {
                      processZipFiles(nestPathPrefix+"\\"+zentry.getName());
                  }
              }
              is.close();
            }
          }
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        } finally{
            if(is != null)
                is.close();
            if(zis!=null)
                zis.close();
        }
    }  

可能是我做错了什么,或者使用了错误的UTIL。我的目标是确定是否有任何文件或嵌套zip文件具有我不允许的文件扩展名。这是为了确保我可以阻止我的用户上传被禁止的文件,即使他们正在压缩它。我还可以选择使用Tika,它可以进行递归解析(使用Zukka Zitting的解决方案),但我不确定是否可以按照自己的意愿使用元数据进行这种检测。

感谢任何帮助/建议。

共有1个答案

钱均
2023-03-14

使用Commons Compress会更容易,尤其是因为它在各种解压器之间有合理的共享接口,这使得生活更容易,同时允许处理其他压缩格式(如Tar)

如果您确实只想使用内置的Zip支持,我建议您这样做:

File file = new File("outermost.zip");
FileInputStream input = new FileInputStream(file);
check(input, file.toString());

public static void check(InputStream compressedInput, String name) {
   ZipInputStream input = new ZipInputStream(compressedInput);
   ZipEntry entry = null;
   while ( (entry = input.getNextEntry()) != null ) {
      System.out.println("Found " + entry.getName() + " in " + name);
      if (entry.getName().endsWith(".zip")) { // TODO Better checking
         check(input, name + "/" + entry.getName());
      }
   }
}

当您尝试将outer.zip中的inner.zip作为本地文件读取时,您的代码将失败,但它不作为独立文件存在。上面的代码将处理以. zip结尾的内容作为另一个zip文件,并且会递归

你可能想使用公共压缩,这样你就可以用备用文件名、其他压缩格式等来处理事情

 类似资料:
  • 我有一个压缩文件。“test.zip”,其中包含另外两个zip文件-a.zip和b.zip。我只想提取a.zip的内容,而不触及b.zip。 我尝试了下面的代码片段,但还没有找到运气- 请告知如何实现这一目标。

  • 我想从嵌套的zip文件中读取(另一个zip中的zip文件) a.zip->b.zip->c.txt 以下是测试程序: 和输出:

  • 我想用Java编写一个GUI zip/unzip程序。该程序将能够压缩文件和目录/IES的任何组合,并解压缩一个或多个压缩文件。 现在我刚刚完成了GUI和zip Funtion。但是zip funtion似乎不能正常工作,产生的zip文件不知何故被破坏了。我找不到问题到底出在哪里。它似乎与函数或函数有关。 当我测试该程序时,输出如下: 归档:找不到test1.zip中央目录结束签名。要么这个文件不

  • 当我运行这段代码时,我只得到命令提示。。bat文件没有运行。如何使用这段代码执行批处理文件? 提前致谢

  • 正在发生的事情: 在第8点。无论处理程序是否取消事件,由于取消检查默认为false,第二个事件已经排队。Guava的EventBus坚持在启动下一个事件之前完成当前的处理程序运行,我确信这有其用处,但这不是我想要的。 尝试黑客:

  • 我是骆驼的新手。我将有一个文件处理与骆驼,但我还没有找到一个现成的解决方案,我的情况。我必须一起处理多个文件,以防它们存在。这些文件上载到特定文件夹时会有一些延迟(例如:我们有两个文件a.csv和b.csv,a.csv上载的时间比b.csv晚10秒,反之亦然)。此外,如果一个文件缺席超过特定的时间,我只需要处理一个文件。有谁能帮我选一个图案吗?据我所知,我可以使用camel过滤器来确保我们已经有了