如何访问jar文件中的文件夹内容?

我需要看一下特定包中的文件名。 目前,我正在做以下事情:

ClassLoader loader = Thread.currentThread().getContextClassLoader(); URL packageUrl = loader.getResource(getPackage().replace('.', '/')); File packageDir = new File(packageUrl.getFile()); // Work with the files inside the directory 

这实际上在Eclipse中工作正常,因为默认情况下它不打包我的应用程序。 但是,当我从jar文件运行它时,我在packageUrl上得到一个NullPointerException

那么,我如何获得jar中包的内容列表? 我的研究建议使用getResourceAsStream ,但我不太确定如何使用InputStream探索目录,如果可能的话。

您可以获取jar文件的路径并使用ZipInputStream列出该jar文件中的所有文件。

要知道正在运行的jar的路径,请尝试使用:

 InputStream in = MyClass .class .getProtectionDomain() .getCodeSource() .getLocation() .openStream(); 

另请参阅: 如何列出JAR文件中的文件?

更新

我编写了一个运行你的解决方案并且工作完美:

 C:\java\injar>dir El volumen de la unidad C no tiene etiqueta. El número de serie del volumen es: 22A8-203B Directorio de C:\java\injar 21/02/2011 06:23 pm  . 21/02/2011 06:23 pm  .. 21/02/2011 06:23 pm 1,752 i18n.jar 21/02/2011 06:23 pm  src 21/02/2011 06:21 pm  x C:\java\injar>jar -tf i18n.jar META-INF/ META-INF/MANIFEST.MF I18n.class x/ x/y/ x/y/z/ x/y/z/hola.txt C:\java\injar>type src\I18n.java import java.util.*; import java.net.*; import java.util.jar.*; class I18n { public static void main( String ... args ) { getLocaleListFromJar(); } private static List getLocaleListFromJar() { List locales = new ArrayList(); try { URL packageUrl = I18n.class.getProtectionDomain().getCodeSource().getLocation(); JarInputStream jar = new JarInputStream(packageUrl.openStream()); while (true) { JarEntry entry = jar.getNextJarEntry(); if (entry == null) { System.out.println( "entry was null "); break; } String name = entry.getName(); System.out.println( "found : " +name ); /*if (resourceBundlePattern.matcher(name).matches()) { addLocaleFromResourceBundle(name, locales); }*/ } } catch (Exception e) { System.err.println(e); return null; //return getLocaleListFromFile(); // File based implementation in case resources are not in jar } return locales; } } C:\java\injar>java -jar i18n.jar found : I18n.class found : x/ found : x/y/ found : x/y/z/ found : x/y/z/hola.txt entry was null 

您可以使用JarInputStream来读取jar文件的内容。 您将迭代getNextJarEntry()返回的具有getName()JarEntry对象。 如果您不关心任何特定于jar的元数据,例如代码签名者或其他Manifest条目,您可以坚持使用ZipInputStream超类。