【问题标题】:How to access files inside of a folder that is inside of a ZipEntry如何访问 ZipEntry 内的文件夹内的文件
【发布时间】:2013-08-16 18:43:40
【问题描述】:

对不起,令人困惑的标题。基本上我有一个 ZipFile,里面有一堆 .txt 文件,但也有一个文件夹。我在下面显示的代码是在 zip 条目中找到该文件夹​​。这部分我做得很好。问题是,一旦我找到该文件夹​​,它就是一个 ZipEntry。碰巧没有任何有用的方法来获取该文件夹内的条目。我找到的文件夹中有更多我想要处理的 .txt 文件(这是主要目标)。

zipFile = new ZipFile(zipName);
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while(entries.hasMoreElements()){
    ZipEntry current = entries.nextElement();
    if(current.getName().equals(folderName)) {
         assertTrue(current.isDirectory());
        //Here is where I want to get the files in the folder 
    }
}

【问题讨论】:

    标签: java io zipfile


    【解决方案1】:

    ZipEntry 有一个方法 isDirectory()

    如果这是一个目录条目,则返回 true。目录条目是 定义为名称以“/”结尾的人。

    您要做的是遍历所有条目(就像您正在做的那样)并为目录内的条目获取InputStream,即。具有相对于目录的路径。

    假设folderName 的值为"/zip/myzip/directory",那么该目录中的文件将具有"/zip/myzip/directory/myfile.txt" 的名称。你可以使用Java NIO Path api来帮助你

    Path directory = Paths.get("/zip/myzip/directory"); // you get this directory path from the ZipEntry
    Path file = Paths.get(current.getName());
    if (file.startsWith(directory)) {
       // do your thing
    }
    

    你可以得到InputStream作为

    zipFile.getInputStream(current);
    

    注意,Zip 文件中的路径将相对于 Zip 位置的根目录。如果 zip 位于

    C:/Users/You/Desktop/myzip.zip
    

    zip 中直接显示路径的文件夹

    directory/
    

    【讨论】:

      【解决方案2】:

      类似的东西可能会对你有所帮助

      final ZipFile zf = new ZipFile(filename);
      for (final Enumeration<? extends ZipEntry> e = zf.entries(); e.hasMoreElements();) {
      final ZipEntry ze = e.nextElement();
      if (!ze.isDirectory()) {
           final String name = ze.getName();
           //.....
          }
      }
      

      享受它;-)

      【讨论】:

        【解决方案3】:

        实际上有一种更简单的方法可以做到这一点。如果您知道当前条目是一个目录,那么在使用 ZipInputStream 时,下一个元素将自动是该目录中的任何内容。例如,假设您的目录结构是这样的:

        Dir1/A.txt Dir1/B.txt Dir2/C.txt D.txt
        

        然后要访问以上所有三个,您只需以这种方式进行:

        ZipInputStream Zis = new ZipInputStream(in);
        ZipEntry entry = Zis.getNextEntry();
        while (entry != null) {
            if(!entry.isDirectory)
               //do something with entry  
            //else continue  
            entry = Zis.getNextEntry(); 
        }
        

        这将遍历所有文件(按它们列出的顺序),而不必明确检查它们是否是目录,因为您没有对它们做任何不同的事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-30
          • 2013-02-03
          • 1970-01-01
          • 2020-04-04
          • 2021-11-08
          • 2013-07-15
          相关资源
          最近更新 更多