将文件列在当前JAR文件的目录中

我正在JAVA制作一个游戏,我想在我的jar中的某个目录中找到一个文件列表,这样我就可以确保在游戏中使用这些类的列表。

例如,在我的jar中我有一个目录

mtd/entity/creep/ 

我想使用jar中另一个类的java代码获取该目录中所有.class文件的列表。

这样做的最佳代码是什么?

旧的java1.4代码,但这会给你的想法:

 private static List getClassesFromJARFile(String jar, String packageName) throws Error { final List classes = new ArrayList(); JarInputStream jarFile = null; try { jarFile = new JarInputStream(new FileInputStream(jar)); JarEntry jarEntry; do { try { jarEntry = jarFile.getNextJarEntry(); } catch(IOException ioe) { throw new CCException.Error("Unable to get next jar entry from jar file '"+jar+"'", ioe); } if (jarEntry != null) { extractClassFromJar(jar, packageName, classes, jarEntry); } } while (jarEntry != null); closeJarFile(jarFile); } catch(IOException ioe) { throw new CCException.Error("Unable to get Jar input stream from '"+jar+"'", ioe); } finally { closeJarFile(jarFile); } return classes; } private static void extractClassFromJar(final String jar, final String packageName, final List classes, JarEntry jarEntry) throws Error { String className = jarEntry.getName(); if (className.endsWith(".class")) { className = className.substring(0, className.length() - ".class".length()); if (className.startsWith(packageName)) { try { classes.add(Class.forName(className.replace('/', '.'))); } catch (ClassNotFoundException cnfe) { throw new CCException.Error("unable to find class named " + className.replace('/', '.') + "' within jar '" + jar + "'", cnfe); } } } } private static void closeJarFile(final JarInputStream jarFile) { if(jarFile != null) { try { jarFile.close(); } catch(IOException ioe) { mockAction(); } } } 

可能最好的方法是在编译时列出类。

有一种脆弱的运行时方法。 拿你的Classthis.getClass() MyClass.class )。 调用getProtectionDomain 。 调用getCodeSource 。 调用getLocation 。 调用openConnection 。 (或者打开资源。)转换为JarURLConnection 。 调用getJarFile 。 来电entries 。 通过检查getName迭代。 我真的不推荐这种方法。

请记住, JAR文件只是重命名的ZIP文件,并且很容易在Java中读取ZIP文件的内容:

  File jarName = null; try { jarName = new File (Dir.class.getProtectionDomain().getCodeSource().getLocation().toURI()); } catch (Exception e) { e.printStackTrace(); } try { ZipFile zf=new ZipFile(jarName.getAbsoluteFile()); Enumeration e=zf.entries(); while (e.hasMoreElements()) { ZipEntry ze=(ZipEntry)e.nextElement(); System.out.println(ze.getName()); } zf.close(); } catch (IOException e) { e.printStackTrace(); } 

这是不可能的,因为Java不提供对从中加载类的jar文件的直接访问。 您可以尝试解析java.class.path系统属性以查找它,但这在所有情况下都不起作用。 或者您可以限制jar文件驻留的位置,或以不同的方式提供类的列表(例如通过清单文件)。