2008-12-06 17 views
14

Tworzę grę w języku JAVA, gdzie chcę wymyślić listę plików w określonym katalogu w moim słoiku, więc mogę mieć pewność, że lista tych plików klasy do wykorzystania w grze.Lista plików w katalogu bieżącego pliku JAR

Na przykład powiedzieć moim słoiku mam katalogiem

mtd/entity/creep/ 

Chcę uzyskać listę wszystkich plików .class w tym katalogu użyciu kodu java z innej klasy w słoiku.

Jaki jest najlepszy kod do tego?

Odpowiedz

8

Stary kod java1.4, ale to nie daje pomysł:

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(); 
     } 
    } 
} 
+0

Po odrobinie brudząc z tym mam to działa. Dziękuję Ci bardzo! –

+0

Ooh, to jest dokładnie to, czego potrzebuję tutaj teraz - dzięki! – Dan

+0

Fajnie, z przyjemnością pomogę :) – VonC

-2

to nie jest możliwe, ponieważ Java nie zapewniają bezpośredni dostęp do słoika plik klasy są ładowane z. Możesz spróbować przeanalizować właściwość systemową java.class.path, aby ją znaleźć, ale to by nie działało w każdych okolicznościach. Możesz też ograniczyć lokalizację pliku jar lub podać listę klas w inny sposób (na przykład poprzez plik manifestu).

+0

co jest nie tak z tą odpowiedzią? Zakładałem, że większym problemem będzie znalezienie ścieżki do pliku JAR - w rzeczywistości wydobywanie treści powinno być dość banalne. –

1

Prawdopodobnie najlepszym sposobem jest lista klas podczas kompilacji.

Istnieje podejście kruchego środowiska wykonawczego. Weź Class (MyClass.class z this.getClass()). Zadzwoń pod numer getProtectionDomain. Zadzwoń pod numer getCodeSource. Zadzwoń pod numer getLocation. Zadzwoń pod numer openConnection. (Można też otworzyć zasób). Przesyłaj na numer JarURLConnection. Zadzwoń pod getJarFile. Zadzwoń pod numer entries. Iteruj poprzez sprawdzanie getName. Naprawdę nie polecam tego podejścia.

+0

Przykład: http://stackoverflow.com/a/1429275/603516 – Vadzim

0

Pamiętaj, że JAR pliki są tylko pocztowy pliki nazwę, i to jest bardzo łatwe do odczytania zawartości pocztowy plików w Javie:

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(); 
    } 
Powiązane problemy