Java 如何在JAR中搜索文件?

Java 如何在JAR中搜索文件?,java,jar,executable-jar,Java,Jar,Executable Jar,我有一个JAR文件,我想搜索其中是否存在类文件 import java.util.jar.*; public class Check { public static void main(String args[]) throws Exception { String path="C:\\workspace\\Project\\sun\\tools\\jam-dt.jar"; path=path.replace("\\","/");

我有一个JAR文件,我想搜索其中是否存在类文件

import java.util.jar.*;

 public class Check
 {
     public static void main(String args[])  throws Exception
     {
         String path="C:\\workspace\\Project\\sun\\tools\\jam-dt.jar";
         path=path.replace("\\","/");
         JarFile jar=new JarFile(path);

         JarEntryentry=jar.getJarEntry("com/sun/xml/ws/binding/Bind.class");
    if(entry!=null)
    {
        System.out.println(" Entry present");

    }
    else
    {
        System.out.println("No Entry");
    }
}
}


但是,JAR文件中有许多目录。我无法在getJarEntry函数中手动输入它们并进行检查。如何检查是否存在类。如何在JAR中搜索文件?

使用JarFile.entries()并对其进行迭代。

您可以使用下面的linux命令在JAR文件中搜索类:

jar-tvf myjar.jar | grep com.sun.xml.ws.binding.Bind.class

String path=“C:/Users/hussain.wahid/Desktop/hussain back-up/hussain/Eclipse WorkSpace/SO/poi.jar”;
String path="C:/Users/hussain.wahid/Desktop/hussain back up/Hussain/Eclipse WorkSpace/SO/poi.jar";
         path=path.replace("\\","/");
         JarFile jar=new JarFile(path);
         ArrayList<String> fileNameList = new ArrayList<String>();

         Enumeration<JarEntry> myEntry = jar.entries();
         while(myEntry.hasMoreElements())
         {
             //System.out.println(myEntry.nextElement().toString());
             fileNameList.add(myEntry.nextElement().toString());
         }
         System.out.println(fileNameList.contains("com/sun/xml/ws/binding/Bind.class"));
        //org/apache/poi/hssf/record/aggregates/
路径=路径。替换(“\\”,“/”; JarFile jar=新的JarFile(路径); ArrayList fileNameList=新的ArrayList(); 枚举myEntry=jar.entries(); while(myEntry.hasMoreElements()) { //System.out.println(myEntry.nextElement().toString()); 添加(myEntry.nextElement().toString()); } println(fileNameList.contains(“com/sun/xml/ws/binding/Bind.class”); //org/apache/poi/hssf/record/aggregates/
我试图使它更容易理解

顺便说一句,引入arraylist是完全没有必要的

    Enumeration<JarEntry> myEntry = jar.entries();
             while(myEntry.hasMoreElements())
             {
System.out.println(myEntry.nextElement().toString().equals("org/apache/poi/hssf/record/aggregates/"));
             }
枚举myEntry=jar.entries(); while(myEntry.hasMoreElements()) { System.out.println(myEntry.nextElement().toString().equals(“org/apache/poi/hssf/record/aggregates/”); }
几年前,我在Windows上使用命令行运行此命令:

for /R %G in (*.jar) do @jar -tvf "%G" | find "someFileNameNoExtension" > NUL && echo "%G"

为了澄清,您知道要搜索的文件名(Bind.class),但不知道它将位于哪个目录中?为什么不能迭代jar中的每个条目?如果该类存在于两个不同的包中,您希望发生什么?@mattb yes。。有很多目录要搜索..然后我想知道这两个目录@KevinWorkmanOkay,那么你为什么不能迭代jar中的每个条目,并将匹配项添加到列表中呢?