java - 在 .jar 中获取目录

标签 java url jar applet directory

我正在尝试访问我的 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/

相关文章:

java - 检查列表条目是否包含单词序列java

使用部分捕获进行 url 验证的正则表达式

php - 在 HTML 中显示网页的当前 URL(动态)

java - 在 Eclipse 中制作的可运行 Jar,无法在未安装 JDK 的电脑上运行

java - 无论如何我可以指定 Android 中编辑文本的高度

java - 如何减少 JAXB 上下文开销?

reactjs - 如何在到达路由器上获取参数

java - 在java中设置数据库文件的路径

spring - 如何在我的 Maven 项目中包含 javax.servlet servlet-api 3.0.1?

java - Git:重命名的文件在java中编译时会导致冲突