当前位置: 首页 > 面试题库 >

如何计算JAR内文件夹中的文件数?

壤驷穆冉
2023-03-14
问题内容

我花了一些时间试图找到一种方法来计算JAR内文件夹中文件的数量。我整理了几个示例,这些示例具有不同的用途,可以完成这项工作。当我通过Eclipse运行代码时,它的计数就很好,但是在导出到JAR后,它失败并返回0。在这种情况下,我使用的文件夹路径只是“
rules /”。我将不胜感激任何建议或样品。谢谢。

public static int countFiles(String folderPath) throws IOException { //Counts the number of files in a specified folder
    ClassLoader loader = ToolSet.class.getClassLoader();
    InputStream is = loader.getResourceAsStream(folderPath);
    try {
        byte[] c = new byte[1024];
        int count = 0;
        int readChars = 0;
        boolean empty = true;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
        }
        return (count == 0 && !empty) ? 1 : count;
    } finally {
        is.close();
    }
}

编辑:
以下内容与我的原始问题不完全匹配,但是由于有了MadProgrammer,我得以减少代码并消除了对文件计数的需要。代码吹动会在我的JAR文件中搜索每个文件,寻找以“
.rules”结尾的文件,打开文件,在文件中搜索与“ searchBox.getText()”匹配的字符串,追加结果,然后继续进行下一个“
.rules”文件。

    StringBuilder results = new StringBuilder();
    int count = 0;
    JarFile jf = null;
    try {
        String path = ToolSet.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        String decodedPath = URLDecoder.decode(path, "UTF-8");
        jf = new JarFile(new File(decodedPath));
        Enumeration<JarEntry> entries = jf.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            if (entry.getName().endsWith(".rules")) {
                String name = entry.getName();
                InputStream in = ToolSet.class.getResourceAsStream(name);
                InputStreamReader isr = new InputStreamReader(in);
                BufferedReader bf = new BufferedReader(isr);
                String line;
                while ((line = bf.readLine()) != null) {
                    String lowerText = line.toLowerCase();
                    if(lowerText.indexOf(searchBox.getText().toLowerCase()) > 0) {
                        results.append(line + "\n");
                        count++;
                    }
                }
                bf.close();
            }
        }
    } catch (IOException ex) {
        try {
            jf.close();
        } catch (Exception e2) {
        }
    }
    if(count>0) {
        logBox.setText(results.toString());
    } else {
        logBox.setText("No matches could be found");
    }

问题答案:

Jar文件本质上是带有清单的Zip文件。

Jar /
Zip文件实际上不像磁盘那样具有目录概念。它们只是具有名称的条目列表。这些名称可能包含某种路径分隔符,并且某些条目实际上可能被标记为目录(并且往往没有与之关联的任何字节,仅充当标记)

如果要查找给定路径中的所有资源,则必须打开Jar文件并亲自检查其条目,例如…

JarFile jf = null;
try {
    String path = "resources";
    jf = new JarFile(new File("dist/ResourceFolderCounter.jar"));
    Enumeration<JarEntry> entries = jf.entries();
    while (entries.hasMoreElements()) {
        JarEntry entry = entries.nextElement();
        if (!entry.isDirectory()) {
            String name = entry.getName();
            name = name.replace(path + "/", "");
            if (!name.contains("/")) {
                System.out.println(name);
            }
        }
    }
} catch (IOException ex) {
    try {
        jf.close();
    } catch (Exception e) {
    }
}

现在,这需要您知道要使用的Jar文件的名称,这可能会出现问题,因为您可能希望列出许多不同的Jar中的资源…

更好的解决方案是在构建时生成某种“资源查找”文件,其中包含您可能需要的所有资源名称,甚至可能输入特定名称。

这样您可以简单使用…

BufferedReader reader = null;
try {
    reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsInputStream("/resources/MasterResourceList.txt")));
    String name = null;
    while ((name = br.readLine()) != null) {
        URL url = getClass().getResource(name);
    }
} finally {
    try {
        br.close();
    } catch (Exception exp) {
    }
}

例如…

您甚至可以为文件添加资源数量;)



 类似资料:
  • 问题内容: 如何计算文件夹,其子文件夹和all中的所有文件。该计数不应包括文件夹计数。 我想在MAC中做 问题答案: 会递归列出当前目录中的所有文件(仅限于文件)(替换为路径)。它的输出通过管道传输到其中,以计算行数。

  • 我有一个资源文件夹/包在我的项目的根,我"不"想要加载某个文件。如果我想加载某个文件,我会使用class.getResourceAsStream,我会没事的!!我实际上想做的是在资源文件夹中加载一个“文件夹”,循环该文件夹中的文件,并获得每个文件的流,并在内容中读取...假设在运行时之前没有确定文件名...那我该怎么办?有没有一种方法来获得一个文件夹中的文件列表在您的jar文件?请注意,带有资源的

  • 问题内容: 我需要在运行时复制一个打包在Jar中的文件夹。我想通过在同样包含在同一文件夹中的类中调用函数来实现。 我试过使用: 但这不起作用。我可能必须递归使用函数。有没有更优雅/前瞻的方式来做到这一点? 万一我必须递归地做它:1.我不想指定硬编码的文件,我想动态地做它2.我不想创建一个单独的档案。我希望此资源与处理该资源的类位于同一个Jar中 谢谢 我最后做了Koziołek的建议。尽管我希望有

  • 我有一个带有图形编辑器的项目(如GMF技术),我需要读取一个文件。Jar库位于项目的类路径上。 VectorSync_1.0.0.201403121100.jar具有如下结构: 矢量同步: 图标/矢量同步。gif 这个导入的项目的类路径。Jar文件是: 我使用此方法尝试访问. xml文件: 但使用的方法始终返回null。 你能帮我解决这个问题吗 谢谢

  • 问题内容: 我在项目的根目录中有一个资源文件夹/程序包,我“不想”加载某个文件。如果我想加载某个文件,我将使用class.getResourceAsStream,我会很好的!我实际上想要做的是在资源文件夹中加载一个“文件夹”,循环访问该文件夹中的文件,并获取每个文件的流,并读取内容…假设在运行时之前未确定文件名… 我该怎么办?有没有一种方法可以获取jar文件中“文件夹”中文件的列表?请注意,带有资

  • 问题内容: 我正在使用Eclipse,我需要能够将Java库(JAR文件)添加到Web应用程序的文件夹中。我该如何实现? 问题答案: 将jar文件添加到您的WEB-INF / lib文件夹中。 在Eclipse中右键单击您的项目,然后转到“构建路径>配置构建路径” 添加“ Web应用程序库”库 这将确保所有WEB-INF / lib jar都包含在类路径中。