我花了一些时间试图找到一种方法来计算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都包含在类路径中。