计算 jar 文件条目中的文件数

Count the number of files inside an entry of jar file

我正在寻找一种方法来计算 jar 文件条目中的文件数。

例如,假设我在 jar 中有一个名为“myFolder”的文件夹,我希望能够计算其中的文件数。

我使用了 here 的想法来访问我的文件夹,但我不知道如何访问其中的文件。

这是我的代码:

private int countFiles() {
    JarFile jf = null;
    int counter = 0;
    try {
        jf = new JarFile(new File(ClassName.class
                .getProtectionDomain().getCodeSource().getLocation().toURI()));
        Enumeration<JarEntry> entries = jf.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            if (entry.isDirectory()) {
                if (entry.getName().equals("myFolder/")) {
                    ///////
                }
            }
        }
    } catch (Exception ex) {
        try {
            jf.close();
        } catch (Exception e) {
        }
    }
    return counter;
}

感谢帮助!

只有 jar 中的空目录才能通过 isDirectory 测试。
对于文件条目,目录将包含在名称中

shell> import java.util.jar.JarFile;

JarFile jf = new JarFile(new File("test.jar"));
jf ==> java.util.jar.JarFile@32d992b2

jf.stream().forEach(f -> System.out.println(f.getName()))
META-INF/
META-INF/MANIFEST.MF
dir1/Order.MOVED
dir1/Pet.MOVED
dir1/Tag.MOVED
dir1/User.MOVED
empty/

jf.stream().forEach(f -> { if(f.getName().contains("dir1/")) System.out.println(f.getName()) ;})
dir1/Order.MOVED
dir1/Pet.MOVED
dir1/Tag.MOVED
dir1/User.MOVED
jf.stream().forEach(f -> { if(f.getName().contains("dir1/dir2/")) System.out.println(f.getName()) ;})
dir1/dir2/
dir1/dir2/Pet.MOVED
dir1/dir2/Order.MOVED

无需检查是否为目录即可使用

while (entries.hasMoreElements()) {
    JarEntry entry = entries.nextElement();
    if (entry.getName().contains("myFolder/")) {
        ///////
    }
}

这也应该有效

while (entries.hasMoreElements()) {
    JarEntry entry = entries.nextElement();
    if (!entry.isDirectory() && entry.getName().startsWith("myFolder/")) {
        ///////
    }
}

如果您想在 Java 中执行此操作,那么使用 NIO2 API 中的 ZIP 文件系统提供程序 可能更容易。

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;

public class Main {

  public static void main(String[] args) throws IOException {
    Path jarFile = Path.of("path", "to", "file.jar");
    String directoryPath = "/myFolder";

    long fileCount = countFilesInDir(jarFile, directoryPath);
    System.out.println(fileCount);
  }

  public static long countFilesInDir(Path jarFile, String directory) throws IOException {
    try (FileSystem fs = FileSystems.newFileSystem(jarFile)) {
      return Files.list(fs.getPath(directory)).count();
    }
  }
}

如果你只想计算普通文件那么改变:

return Files.list(fs.getPath(directory)).count();

收件人:

return Files.list(directory).filter(Files::isRegularFile).count();

如果你想递归地计算 entries/files 然后检查 java.nio.file.Files#find(Path,int,BiPredicate,FileVisitOption...) 方法。


注意:通常你应该在完成后关闭Files.listFiles.find返回的Stream,但在这种情况下由于 FileSystem 被关闭,应该被关闭。