2008-12-06 39 views
14

JAVA'da oyunumu, kavanozumdaki belirli bir dizindeki dosyaların bir listesini bulmak istiyorum, böylece bunların bir listesini yaptığınızdan emin olabilirim Oyunda kullanılacak sınıflar. ÖrneğinGeçerli JAR dosyasının bir dizinindeki dosyaları listeleme

Ben kavanoza başka sınıftan java kodunu kullanarak bu dizine tüm .class dosyaların bir listesini almak istiyorum ben dizinini

mtd/entity/creep/ 

var benim kavanozda söylüyorlar.

Bunu yapmak için en iyi kod nedir?

cevap

8

Eski java1.4 kodu, ama bu sana fikir vermek istiyoruz: Java sınıfları yüklenir dosyasını kavanoz doğrudan erişim sağlamaz gibi, mümkün değildir

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

aldığım bu karıştırmasını birazcık sonra çalışmak. Çok teşekkür ederim! –

+0

Ooh, işte tam burada ihtiyacım olan şey şu ki - teşekkürler! – Dan

+0

Cool, yardım etmekten mutluluk duyuyorum :) – VonC

-2

. Bulmak için java.class.path sistem özelliğini ayrıştırmayı deneyebilirsiniz, ancak bu her koşulda işe yaramaz. Ya da jar dosyasının nerede bulunacağını veya sınıfların listesini farklı bir şekilde (örneğin, manifest dosyası aracılığıyla) sağlamanız gerekebilir.

+0

Bu cevapla ilgili sorun nedir? Daha büyük sorununun jar dosyasının yolunu bulması olacağını varsaydım - aslında içeriğin çıkarılması oldukça önemsiz olmalı. –

1

Muhtemelen en iyi yaklaşım, sınıfları derleme zamanında listelemektir.

Kırılgan bir çalışma zamanı yaklaşımı var. Class numaralı telefonu (this.getClass()'un MyClass.class numaralı telefonunu) alın. getProtectionDomain numaralı telefonu arayın. getCodeSource'u arayın. getLocation'u arayın. openConnection'u arayın. (Alternatif olarak bir kaynak açın.) JarURLConnection'a yayınlayın. getJarFile numaralı telefonu arayın. entries numaralı telefonu arayın. getName'u denetleyerek yineleyin. Bu yaklaşımı gerçekten önermiyorum.

+0

Örnek: http://stackoverflow.com/a/1429275/603516 – Vadzim

0

JAR dosya adını sadece Posta dosyalar olduğunu unutmayın ve bu Java Posta dosyaların içeriğini okumak çok kolay:

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(); 
    } 
İlgili konular