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