2017-07-03 116 views
1

我不明白如何从生成的jar文件加载文件。Java从jar加载文件

这是我的代码,它工作正常的IDE中,而不是当我运行jar:

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

罐的结构是:

  • META-INF
  • de(以及带有类文件的其余包)
  • file1
  • file2
  • ...等等

所以这些文件直接在jar中没有在任何子文件夹中。

回答

1

您的代码不起作用,因为File对象不能用于访问jar内的文件。你可以做的是使用ZipInputStreams打开&阅读你的jar文件和ZipEntry一起读取你的jar中的单个文件。 此代码可以在jar中工作,但很可能不在IDE中。在这种情况下,您可以检测当前状态(IDE或Jar)并相应地执行所需的加载代码。

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); 
     // ... 
    } 
} 

使用的URL已经建立,我们可以判断,如果该程序是在一个罐子或不符合这个简单的代码:

new File(jar.getFile()).toString().endsWith("jar")
这工作,因为当在IDE中,(在我的情况蚀) new File(jar.getFile()).toString()回报 "D:\Java\Current%20Projects\Test\bin" 其中在一个罐子里,我得到了 "D:\Windows%20Folders\Desktop\Test.jar"

+0

谢谢,这完美的作品! – expensne