如何直接从.JAR-JAVA中的子目录获取文件列表

如何直接从.JAR-JAVA中的子目录获取文件列表,java,path,jar,filepath,subdirectory,Java,Path,Jar,Filepath,Subdirectory,我正在寻找一种直接获取.jar中指定子目录中所有文件列表的方法 这是相似的: 但不幸的是,上面列出的方法将迭代整个.jar中的所有文件。当使用一个包含许多文件的.jar时,这似乎是不切实际的。必须有一种方法可以直接指向.jar中的子目录并遍历其内容,而不必遍历jar的所有内容,然后过滤结果以查找您关心的条目 以下是我的大致情况: public static ArrayList<String> loadInternalFileListing(MetaDataType type, Met

我正在寻找一种直接获取.jar中指定子目录中所有文件列表的方法

这是相似的:

但不幸的是,上面列出的方法将迭代整个.jar中的所有文件。当使用一个包含许多文件的.jar时,这似乎是不切实际的。必须有一种方法可以直接指向.jar中的子目录并遍历其内容,而不必遍历jar的所有内容,然后过滤结果以查找您关心的条目

以下是我的大致情况:

public static ArrayList<String> loadInternalFileListing(MetaDataType type, MetaDataLocation location, String siteId)
{
  ArrayList<String> filenameList = new ArrayList<String>();
  URL url = getInternalFile(type, null, location, siteId);

  JarURLConnection juc = null;
  JarFile jarFile = null;

  try
  {
    juc = (JarURLConnection) url.openConnection();
    jarFile = juc.getJarFile();
    Enumeration<JarEntry> entries = jarFile.entries();

    for(JarEntry jarEntry = entries.nextElement(); entries.hasMoreElements(); jarEntry = entries.nextElement())
    {
       ...//logic here
    }
  }
  ... //catch, handle exceptions, finally block and other logic

  return filenameList;
}
公共静态ArrayList loadInternalFileListing(MetaDataType类型、MetaDataLocation位置、字符串siteId)
{
ArrayList filenameList=新的ArrayList();
URL=getInternalFile(类型、null、位置、站点ID);
JarURLConnection juc=null;
JarFile JarFile=null;
尝试
{
juc=(JarURLConnection)url.openConnection();
jarFile=juc.getJarFile();
枚举条目=jarFile.entries();
for(JarEntry JarEntry=entries.nextElement();entries.hasMoreElements();JarEntry=entries.nextElement())
{
…//这里的逻辑
}
}
…//捕获、处理异常、最终阻塞和其他逻辑
返回文件名列表;
}
变量:url->:jar:file:/C:/jboss-4.2.2.GA/server/username/tmp/deploy/tmp84212649304677110704someear.ear-contents/SomeBusiness.jar/细分1/细分2/细分3/细分4/

路径:/subdir1/subdir2/subdir3/subdir4/正是我要迭代的地方

调试表明,juc确实正确创建并指向正确的路径jarFile然后,正如预期的那样,只给我jar文件路径,这就是我丢失子目录和开始在根目录上迭代的原因。这一切都是有道理的。这显然不是正确的方法。一定有别的办法


在理论上指向我感兴趣的正确目录的JarURLConnection上乱搞,并没有显示出任何有用的东西。存在JarURLConnection.getInputStream()。调试器表明它最终保存了一个ZipFileInputStream,但我无法访问它,再进一步看,它似乎只是ZipFile的ZipFileInputStream,这让我回到了原点。

对不起,没有其他方法,至少在标准java库中是这样。zip文件只包含一个条目列表,其中没有“随机访问”查找。可能还有其他库为您解析列表并创建某种层次结构的条目映射,但无论如何,有些代码需要遍历所有条目以找到您需要的内容。

发布后,我认为这可能正是由于zip文件的格式/结构所造成的。谢谢