2017-07-03 3 views
1

Je ne comprends pas comment charger les fichiers du pot produit.Java chargement des fichiers à partir du pot

Ceci est mon code et il fonctionne très bien dans l'EDI, mais pas quand je lance le pot:

URL url = ClassLoader.getSystemResource("."); 
    try 
    { 
     File dir = new File(url.toURI()); 
     for (File f : dir.listFiles()) 
     { 
      String fn = f.getName(); 
      if (fn.endsWith(".png")) 
      { 
       ImageView iv = new ImageView(fn); 
       // ... 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

La structure du pot est:

  • META-INF
  • de (et le reste des paquets avec les fichiers de classe)
  • file1
  • file2
  • ... et ainsi de suite

Ainsi, les fichiers se trouvent directement dans le fichier jar et ne se trouvent dans aucun sous-dossier.

Répondre

1

Votre code ne fonctionne pas car les objets Fichier ne peuvent pas être utilisés pour accéder aux fichiers dans un fichier jar. Ce que vous pouvez faire est d'utiliser ZipInputStreams pour ouvrir & lire votre fichier jar à côté de ZipEntry pour lire les fichiers individuels dans votre pot. Ce code fonctionnera dans un pot, mais probablement pas dans un IDE. Dans ce cas, vous pouvez détecter l'état actuel (IDE ou Jar) et exécuter le code de chargement souhaité en conséquence.

CodeSource src = ClientMain.class.getProtectionDomain().getCodeSource(); 

URL jar = src.getLocation(); 
ZipInputStream zip = new ZipInputStream(jar.openStream()); 
ZipEntry entry = null; 

while ((entry = zip.getNextEntry()) != null) { 
    String entryName = entry.getName(); 
    if (entryName.endsWith(".png")) { 
     BufferedImage image = ImageIO.read(zip); 
     // ... 
    } 
} 

En utilisant la configuration déjà de l'URL, nous pouvons déterminer si le programme est dans un bocal ou non avec ce code simple:

new File(jar.getFile()).toString().endsWith("jar")
Cela fonctionne parce que quand dans un IDE (Eclipse dans mon cas) new File(jar.getFile()).toString() retours "D:\Java\Current%20Projects\Test\bin" où, comme dans un pot, je me suis "D:\Windows%20Folders\Desktop\Test.jar"

+0

Merci, cela fonctionne parfaitement! – expensne