gpt4 book ai didi

java - 如何从 .jar 加载文件夹?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:08 25 4
gpt4 key购买 nike

好的。所以我有一个非常简单的问题:我希望能够从正在运行的 .jar 文件中加载资源(整个文件夹),但我无法让它工作。这是我尝试过的(如果类名是“myClass”并且文件夹被称为“myFolder”),但它总是抛出 NullPointerException:

URL folderURL = myClass.class.getClassLoader().getResource("myFolder/");
String folderPath = folderURL.getPath();
File myFolder = new File(folderPath);

NullPointerException 总是在我创建“myFolder”之前抛出。

更多信息:我必须从静态上下文访问该文件夹。访问该文件夹的类与文件夹本身不在同一目录中。(该文件夹位于 jar 内的根目录中,该类是几个子包。)

有人能解决我的问题吗?很抱歉,如果我使用了错误的术语 :P,但您可以提供任何帮助,我们将不胜感激。

最佳答案

这不可能行得通。您正在尝试从 JAR 中的资源创建 File 对象。那不会发生。加载资源的最佳方法是将一个包文件夹设为资源文件夹,然后在其中创建 Resources.jar 或其他内容,将资源转储到同一目录中,然后使用 Resources.class.getResourceAsStream(resFileName) 在您的其他 Java 类文件中。

如果您需要“暴力破解”由 getResource(..) 给出的 URL 指向的 JAR 目录中的子文件,请使用以下命令(尽管有点 hack!) .它也适用于普通文件系统:

  /**
* List directory contents for a resource folder. Not recursive.
* This is basically a brute-force implementation.
* Works for regular files and also JARs.
*
* @author Greg Briggs
* @param clazz Any java class that lives in the same place as the resources you want.
* @param path Should end with "/", but not start with one.
* @return Just the name of each member item, not the full paths.
* @throws URISyntaxException
* @throws IOException
*/
String[] getResourceListing(Class clazz, String path) throws URISyntaxException, IOException {
URL dirURL = clazz.getClassLoader().getResource(path);
if (dirURL != null && dirURL.getProtocol().equals("file")) {
/* A file path: easy enough */
return new File(dirURL.toURI()).list();
}

if (dirURL == null) {
/*
* In case of a jar file, we can't actually find a directory.
* Have to assume the same jar as clazz.
*/
String me = clazz.getName().replace(".", "/")+".class";
dirURL = clazz.getClassLoader().getResource(me);
}

if (dirURL.getProtocol().equals("jar")) {
/* A JAR path */
String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!")); //strip out only the JAR file
JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
Set<String> result = new HashSet<String>(); //avoid duplicates in case it is a subdirectory
while(entries.hasMoreElements()) {
String name = entries.nextElement().getName();
if (name.startsWith(path)) { //filter according to the path
String entry = name.substring(path.length());
int checkSubdir = entry.indexOf("/");
if (checkSubdir >= 0) {
// if it is a subdirectory, we just return the directory name
entry = entry.substring(0, checkSubdir);
}
result.add(entry);
}
}
return result.toArray(new String[result.size()]);
}

throw new UnsupportedOperationException("Cannot list files for URL "+dirURL);
}

然后可以修改getResource(..)给出的URL并在末尾追加文件,将这些URL传入getResourceAsStream(..),就绪用于加载。如果您不明白这一点,则需要阅读有关类加载的内容。

关于java - 如何从 .jar 加载文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6247144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com