gpt4 book ai didi

java - 在 .jar 中获取目录

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

我正在尝试访问我的 jar 文件中的一个目录。我想遍历目录本身中的每个文件。例如,我尝试使用以下内容:

URL imagesDirectoryURL=getClass().getClassLoader().getResource("Images");

if(imagesFolderURL!=null)
{
File imagesDirectory= new File(imagesDirectoryURL.getFile());
}

如果我测试这个小程序,它运行良好。但是一旦我把里面的东西放进 jar 里,它就不会因为几个原因。如果我使用这段代码,URL 总是指向 jar 之外,所以我必须将 Images 目录放在那里。但是如果我使用 new File(imagesDirectoryURL.toURI());,它在 jar 中不起作用,因为我得到错误 URI not hierarchical。我确定该目录存在于 jar 中。我应该如何获取 jar 中 Images 的内容?

最佳答案

如果您使用 Java 7,这里是一个应该有效的解决方案...“诀窍”是使用新的文件 API。 Oracle JDK 提供了一个 FileSystem可用于查看/修改 ZIP 文件的实现,其中包括 jars!

初步:捕获System.getProperty("java.class.path", ".") , 拆分为 : ;这将为您提供定义的类路径中的所有条目。

首先定义一个获取FileSystem的方法在类路径条目之外:

private static final Map<String, ?> ENV = Collections.emptyMap();

//

private static FileSystem getFileSystem(final String entryName)
throws IOException
{
final String uri = entryName.endsWith(".jar") || entryName.endsWith(".zip"))
? "jar:file:" + entryName : "file:" + entryName;
return FileSystems.newFileSystem(URI.create(uri), ENV);
}

然后创建一个方法来判断路径是否存在于文件系统中:

private static boolean pathExists(final FileSystem fs, final String needle)
{
final Path path = fs.getPath(needle);
return Files.exists(path);
}

用它来定位您的目录。

一旦你有了正确的 FileSystem ,使用它来使用 .getPath() 遍历您的目录如上并打开一个DirectoryStream使用 Files.newDirectoryStream() .

别忘了 .close()一个FileSystem一旦你完成了它!

这是一个示例 main()演示如何读取 jar 的所有根条目:

public static void main(final String... args)
throws IOException
{
final Map<String, ?> env = Collections.emptyMap();
final String jarName = "/opt/sunjdk/1.6/current/jre/lib/plugin.jar";
final URI uri = URI.create("jar:file:" + jarName);
final FileSystem fs = FileSystems.newFileSystem(uri, env);
final Path dir = fs.getPath("/");
for (Path entry : Files.newDirectoryStream(dir))
System.out.println(entry);
}

关于java - 在 .jar 中获取目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5830581/

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