如何获取jar文件内的文件夹路径?

发布于 2024-10-01 21:50:04 字数 5548 浏览 0 评论 0原文

好的,所以在 IDE 中它运行得很好,并表示该文件存在,但是一旦我将其打包到 jar 中,此代码:

File levelFolder = new File(getClass().getResource("data/level").getPath()); 
System.out.println("exists = " + levelFolder.exists());

表示该文件夹不存在。知道为什么吗?

编辑:

jar 文件列表。

G:\java>jar tvf phantasyblade.jar
  6574 Wed Nov 10 22:36:34 PST 2010 META-INF/MANIFEST.MF
  6334 Wed Nov 10 22:36:34 PST 2010 META-INF/CYPRI.SF
   992 Wed Nov 10 22:36:34 PST 2010 META-INF/CYPRI.RSA
     0 Wed Nov 10 22:31:32 PST 2010 META-INF/
   717 Mon Nov 08 00:08:30 PST 2010 Switch.class
   935 Wed Nov 10 22:21:14 PST 2010 Sword1.class
   803 Tue Nov 09 13:42:38 PST 2010 SwordBlock.class
  2674 Tue Nov 09 13:42:38 PST 2010 Thing.class
     0 Wed Nov 10 22:32:56 PST 2010 data/
     0 Wed Nov 10 22:32:56 PST 2010 data/audio/
108669 Mon Nov 30 22:32:02 PST 2009 data/audio/boss1.ogg
 30866 Wed Nov 25 13:40:12 PST 2009 data/audio/edie.wav
 11440 Wed Dec 02 15:22:00 PST 2009 data/audio/ehit.wav
191532 Fri Apr 16 07:32:46 PDT 2010 data/audio/itemget.wav
154856 Mon Nov 30 21:55:18 PST 2009 data/audio/map1.ogg
 18572 Wed Aug 19 02:16:30 PDT 2009 data/audio/pdie.wav
 30924 Wed Dec 02 15:02:54 PST 2009 data/audio/pget.wav
 10044 Wed Aug 19 02:13:52 PDT 2009 data/audio/phit.wav
 24920 Wed Dec 02 15:08:44 PST 2009 data/audio/plife.wav
 17399 Mon Aug 24 17:40:00 PDT 2009 data/audio/sword.wav
 71946 Mon Nov 30 22:36:08 PST 2009 data/audio/title.ogg
     0 Wed Nov 10 22:32:56 PST 2010 data/graphics/
  5486 Mon Dec 07 23:15:46 PST 2009 data/graphics/alienzaku1.png
  1372 Mon Dec 14 02:05:44 PST 2009 data/graphics/ammo15.png
   888 Wed Nov 10 20:07:38 PST 2010 data/graphics/block.png
  1841 Mon Dec 07 16:50:00 PST 2009 data/graphics/bluegem.png
101871 Mon Dec 07 22:59:30 PST 2009 data/graphics/boss1.png
  9206 Mon Dec 14 13:21:26 PST 2009 data/graphics/bossblock1.png
   280 Tue Nov 18 08:13:44 PST 2008 data/graphics/bullet.png
  2831 Wed Dec 16 14:11:30 PST 2009 data/graphics/chargeshot.png
   277 Tue Nov 18 16:12:32 PST 2008 data/graphics/ebullet.png
  1928 Wed Dec 16 14:05:14 PST 2009 data/graphics/echargeshot.png
  3573 Wed Dec 02 15:07:06 PST 2009 data/graphics/ehealth.png
  6158 Mon Dec 14 22:17:06 PST 2009 data/graphics/gameover.png
  1594 Mon Dec 07 16:49:32 PST 2009 data/graphics/greengem.png
  5279 Mon Dec 07 16:49:44 PST 2009 data/graphics/health.png
  5591 Wed Dec 16 22:37:20 PST 2009 data/graphics/hexcontainer.png
 23037 Tue Dec 15 13:03:32 PST 2009 data/graphics/hud.png
  8173 Thu Dec 03 00:22:14 PST 2009 data/graphics/hud1.png
   280 Tue Nov 18 08:13:44 PST 2008 data/graphics/hudbullet.png
   606 Wed Dec 02 04:58:50 PST 2009 data/graphics/hudgem.png
  3527 Wed Dec 02 15:07:02 PST 2009 data/graphics/hudhealth.png
 13726 Wed Dec 16 14:40:36 PST 2009 data/graphics/hunter.png
   666 Wed Nov 10 21:09:54 PST 2010 data/graphics/key.png
 11010 Thu Nov 26 11:14:02 PST 2009 data/graphics/levelclear.png
  1306 Wed Nov 10 20:08:42 PST 2010 data/graphics/lockedblock.png
  2340 Mon Dec 14 16:32:26 PST 2009 data/graphics/mapsword.png
  1448 Wed Nov 10 20:20:58 PST 2010 data/graphics/moveblock.png
  1660 Sun Nov 07 12:54:42 PST 2010 data/graphics/neblock.png
 30258 Mon Dec 07 16:50:28 PST 2009 data/graphics/neoscout1.png
  9569 Mon Dec 07 23:25:08 PST 2009 data/graphics/player.png
  5903 Mon Dec 07 16:36:02 PST 2009 data/graphics/playerdead.png
  3910 Fri Apr 16 07:23:12 PDT 2010 data/graphics/playerget.png
 11966 Mon Dec 14 00:07:32 PST 2009 data/graphics/playerroll.png
  1316 Wed Nov 10 20:12:18 PST 2010 data/graphics/stepswitch.png
  2972 Mon Dec 07 23:22:08 PST 2009 data/graphics/sword.png
  2972 Mon Dec 07 23:22:08 PST 2009 data/graphics/sword2.png
  1450 Sun Nov 07 12:51:22 PST 2010 data/graphics/swordblock.png
 10860 Fri Apr 16 07:29:08 PDT 2010 data/graphics/swordget.png
289531 Sun Dec 13 00:28:56 PST 2009 data/graphics/tilemap.png
134821 Tue Dec 15 00:28:38 PST 2009 data/graphics/title.png
  6044 Wed Nov 25 17:39:50 PST 2009 data/graphics/win.png
  1511 Wed Nov 10 10:38:02 PST 2010 data/graphics/zbutton.png
     0 Wed Nov 10 22:32:56 PST 2010 data/level/
  2132 Wed Nov 10 20:59:58 PST 2010 data/level/map1.lv
   949 Wed Nov 10 22:23:24 PST 2010 data/level/map2.lv
   813 Wed Nov 10 21:07:10 PST 2010 data/level/map3.lv
  1370 Sun Nov 07 12:37:42 PST 2010 Ammo15.class
  1369 Sun Nov 07 12:37:42 PST 2010 BlueGem.class
  4789 Sun Nov 07 18:26:34 PST 2010 Boss1.class
   825 Mon Nov 08 05:34:02 PST 2010 BossBlock1.class
  6159 Sun Nov 07 18:30:54 PST 2010 Bullet.class
  3487 Sun Nov 07 12:37:42 PST 2010 ChargeShot.class
  8425 Wed Nov 10 22:01:54 PST 2010 Enemy.class
  5837 Wed Nov 10 22:01:54 PST 2010 Enemy1.class
  6164 Wed Nov 10 22:01:54 PST 2010 Enemy2.class
  4902 Sun Nov 07 18:26:34 PST 2010 Enemy3.class
  7780 Sun Nov 07 18:26:34 PST 2010 Enemy4.class
 30632 Wed Nov 10 22:19:38 PST 2010 Game1.class
   656 Tue Nov 09 13:42:32 PST 2010 GrabBlock1.class
  1372 Sun Nov 07 12:37:42 PST 2010 GreenGem.class
  1074 Tue Nov 09 13:42:34 PST 2010 HexContainer.class
  1372 Sun Nov 07 12:37:42 PST 2010 Item.class
   811 Wed Nov 10 20:13:46 PST 2010 Key.class
   609 Mon Nov 08 20:10:04 PST 2010 Level.class
  1368 Sun Nov 07 12:37:42 PST 2010 Life.class
   656 Wed Nov 10 16:41:50 PST 2010 LockedBlock.class
  2004 Sun Nov 07 18:26:34 PST 2010 Map.class
   751 Tue Nov 09 13:42:36 PST 2010 NEBlock.class
   659 Tue Nov 09 13:42:36 PST 2010 NormalBlock1.class
 18722 Wed Nov 10 22:02:28 PST 2010 Player.class
  1726 Mon Nov 08 05:34:06 PST 2010 StepSwitch.class

G:\java>

Okay, so in the IDE it runs great and says the file exists, but once I pack it into a jar this code:

File levelFolder = new File(getClass().getResource("data/level").getPath()); 
System.out.println("exists = " + levelFolder.exists());

says the folder doesn't exist. any idea why?

edit:

jar file listing.

G:\java>jar tvf phantasyblade.jar
  6574 Wed Nov 10 22:36:34 PST 2010 META-INF/MANIFEST.MF
  6334 Wed Nov 10 22:36:34 PST 2010 META-INF/CYPRI.SF
   992 Wed Nov 10 22:36:34 PST 2010 META-INF/CYPRI.RSA
     0 Wed Nov 10 22:31:32 PST 2010 META-INF/
   717 Mon Nov 08 00:08:30 PST 2010 Switch.class
   935 Wed Nov 10 22:21:14 PST 2010 Sword1.class
   803 Tue Nov 09 13:42:38 PST 2010 SwordBlock.class
  2674 Tue Nov 09 13:42:38 PST 2010 Thing.class
     0 Wed Nov 10 22:32:56 PST 2010 data/
     0 Wed Nov 10 22:32:56 PST 2010 data/audio/
108669 Mon Nov 30 22:32:02 PST 2009 data/audio/boss1.ogg
 30866 Wed Nov 25 13:40:12 PST 2009 data/audio/edie.wav
 11440 Wed Dec 02 15:22:00 PST 2009 data/audio/ehit.wav
191532 Fri Apr 16 07:32:46 PDT 2010 data/audio/itemget.wav
154856 Mon Nov 30 21:55:18 PST 2009 data/audio/map1.ogg
 18572 Wed Aug 19 02:16:30 PDT 2009 data/audio/pdie.wav
 30924 Wed Dec 02 15:02:54 PST 2009 data/audio/pget.wav
 10044 Wed Aug 19 02:13:52 PDT 2009 data/audio/phit.wav
 24920 Wed Dec 02 15:08:44 PST 2009 data/audio/plife.wav
 17399 Mon Aug 24 17:40:00 PDT 2009 data/audio/sword.wav
 71946 Mon Nov 30 22:36:08 PST 2009 data/audio/title.ogg
     0 Wed Nov 10 22:32:56 PST 2010 data/graphics/
  5486 Mon Dec 07 23:15:46 PST 2009 data/graphics/alienzaku1.png
  1372 Mon Dec 14 02:05:44 PST 2009 data/graphics/ammo15.png
   888 Wed Nov 10 20:07:38 PST 2010 data/graphics/block.png
  1841 Mon Dec 07 16:50:00 PST 2009 data/graphics/bluegem.png
101871 Mon Dec 07 22:59:30 PST 2009 data/graphics/boss1.png
  9206 Mon Dec 14 13:21:26 PST 2009 data/graphics/bossblock1.png
   280 Tue Nov 18 08:13:44 PST 2008 data/graphics/bullet.png
  2831 Wed Dec 16 14:11:30 PST 2009 data/graphics/chargeshot.png
   277 Tue Nov 18 16:12:32 PST 2008 data/graphics/ebullet.png
  1928 Wed Dec 16 14:05:14 PST 2009 data/graphics/echargeshot.png
  3573 Wed Dec 02 15:07:06 PST 2009 data/graphics/ehealth.png
  6158 Mon Dec 14 22:17:06 PST 2009 data/graphics/gameover.png
  1594 Mon Dec 07 16:49:32 PST 2009 data/graphics/greengem.png
  5279 Mon Dec 07 16:49:44 PST 2009 data/graphics/health.png
  5591 Wed Dec 16 22:37:20 PST 2009 data/graphics/hexcontainer.png
 23037 Tue Dec 15 13:03:32 PST 2009 data/graphics/hud.png
  8173 Thu Dec 03 00:22:14 PST 2009 data/graphics/hud1.png
   280 Tue Nov 18 08:13:44 PST 2008 data/graphics/hudbullet.png
   606 Wed Dec 02 04:58:50 PST 2009 data/graphics/hudgem.png
  3527 Wed Dec 02 15:07:02 PST 2009 data/graphics/hudhealth.png
 13726 Wed Dec 16 14:40:36 PST 2009 data/graphics/hunter.png
   666 Wed Nov 10 21:09:54 PST 2010 data/graphics/key.png
 11010 Thu Nov 26 11:14:02 PST 2009 data/graphics/levelclear.png
  1306 Wed Nov 10 20:08:42 PST 2010 data/graphics/lockedblock.png
  2340 Mon Dec 14 16:32:26 PST 2009 data/graphics/mapsword.png
  1448 Wed Nov 10 20:20:58 PST 2010 data/graphics/moveblock.png
  1660 Sun Nov 07 12:54:42 PST 2010 data/graphics/neblock.png
 30258 Mon Dec 07 16:50:28 PST 2009 data/graphics/neoscout1.png
  9569 Mon Dec 07 23:25:08 PST 2009 data/graphics/player.png
  5903 Mon Dec 07 16:36:02 PST 2009 data/graphics/playerdead.png
  3910 Fri Apr 16 07:23:12 PDT 2010 data/graphics/playerget.png
 11966 Mon Dec 14 00:07:32 PST 2009 data/graphics/playerroll.png
  1316 Wed Nov 10 20:12:18 PST 2010 data/graphics/stepswitch.png
  2972 Mon Dec 07 23:22:08 PST 2009 data/graphics/sword.png
  2972 Mon Dec 07 23:22:08 PST 2009 data/graphics/sword2.png
  1450 Sun Nov 07 12:51:22 PST 2010 data/graphics/swordblock.png
 10860 Fri Apr 16 07:29:08 PDT 2010 data/graphics/swordget.png
289531 Sun Dec 13 00:28:56 PST 2009 data/graphics/tilemap.png
134821 Tue Dec 15 00:28:38 PST 2009 data/graphics/title.png
  6044 Wed Nov 25 17:39:50 PST 2009 data/graphics/win.png
  1511 Wed Nov 10 10:38:02 PST 2010 data/graphics/zbutton.png
     0 Wed Nov 10 22:32:56 PST 2010 data/level/
  2132 Wed Nov 10 20:59:58 PST 2010 data/level/map1.lv
   949 Wed Nov 10 22:23:24 PST 2010 data/level/map2.lv
   813 Wed Nov 10 21:07:10 PST 2010 data/level/map3.lv
  1370 Sun Nov 07 12:37:42 PST 2010 Ammo15.class
  1369 Sun Nov 07 12:37:42 PST 2010 BlueGem.class
  4789 Sun Nov 07 18:26:34 PST 2010 Boss1.class
   825 Mon Nov 08 05:34:02 PST 2010 BossBlock1.class
  6159 Sun Nov 07 18:30:54 PST 2010 Bullet.class
  3487 Sun Nov 07 12:37:42 PST 2010 ChargeShot.class
  8425 Wed Nov 10 22:01:54 PST 2010 Enemy.class
  5837 Wed Nov 10 22:01:54 PST 2010 Enemy1.class
  6164 Wed Nov 10 22:01:54 PST 2010 Enemy2.class
  4902 Sun Nov 07 18:26:34 PST 2010 Enemy3.class
  7780 Sun Nov 07 18:26:34 PST 2010 Enemy4.class
 30632 Wed Nov 10 22:19:38 PST 2010 Game1.class
   656 Tue Nov 09 13:42:32 PST 2010 GrabBlock1.class
  1372 Sun Nov 07 12:37:42 PST 2010 GreenGem.class
  1074 Tue Nov 09 13:42:34 PST 2010 HexContainer.class
  1372 Sun Nov 07 12:37:42 PST 2010 Item.class
   811 Wed Nov 10 20:13:46 PST 2010 Key.class
   609 Mon Nov 08 20:10:04 PST 2010 Level.class
  1368 Sun Nov 07 12:37:42 PST 2010 Life.class
   656 Wed Nov 10 16:41:50 PST 2010 LockedBlock.class
  2004 Sun Nov 07 18:26:34 PST 2010 Map.class
   751 Tue Nov 09 13:42:36 PST 2010 NEBlock.class
   659 Tue Nov 09 13:42:36 PST 2010 NormalBlock1.class
 18722 Wed Nov 10 22:02:28 PST 2010 Player.class
  1726 Mon Nov 08 05:34:06 PST 2010 StepSwitch.class

G:\java>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧故 2024-10-08 21:50:04

一般来说,这是因为您 getClass() 的类位于 com.something.app 包中,因此使用相对路径,您的数据必须位于 com/something/app/data/level 中。否则使用绝对路径。

查看 jarfile 中的内容:


jar tvf myapp.jar

[好吧,经过大量来回和一些测试]...


jcomeau@intrepid:/tmp$ cat test.java; java -cp test.jar test; jar tvf test.jar
import java.io.*;
public class test {
 public static void main(String[] args) {
  //System.out.println(test.class.getResource("data/level"));
  try {
   System.out.println(new File(test.class.getResource("data/level").getPath()));
   System.out.println(test.class.getResourceAsStream("data/level/test").read());
  } catch (Exception whatever) {
   System.err.println("error: " + whatever);
  }
 }
}
file:/tmp/test.jar!/data/level
116
     0 Thu Nov 11 00:36:14 PST 2010 META-INF/
    40 Thu Nov 11 00:36:14 PST 2010 META-INF/MANIFEST.MF
  1362 Thu Nov 11 00:35:46 PST 2010 test.class
     0 Wed Nov 10 07:53:18 PST 2010 data/
     0 Wed Nov 10 07:53:28 PST 2010 data/level/
     5 Wed Nov 10 07:53:28 PST 2010 data/level/test
jcomeau@intrepid:/tmp$ 

我太累了,无法继续,但 main() 打印 116,这是“的 ASCII 值” t”,read() 读取第一个字节的结果。这应该足以证明 getResourceAsStream() 将使您能够访问您的资源。也应该有一种方法可以使用 File() 来完成此操作,但是返回的路径对于“!”来说很奇怪将 jar 文件的路径与 jar 文件内部的路径分开。我以前从未处理过这个问题。

generally it's because the class you getClass()'d is in package com.something.app, and so with a relative path your data has to be in com/something/app/data/level. Otherwise use an absolute path.

To see where things are in your jarfile:


jar tvf myapp.jar

[ok, after a lot of back-and-forth and some testing]...


jcomeau@intrepid:/tmp$ cat test.java; java -cp test.jar test; jar tvf test.jar
import java.io.*;
public class test {
 public static void main(String[] args) {
  //System.out.println(test.class.getResource("data/level"));
  try {
   System.out.println(new File(test.class.getResource("data/level").getPath()));
   System.out.println(test.class.getResourceAsStream("data/level/test").read());
  } catch (Exception whatever) {
   System.err.println("error: " + whatever);
  }
 }
}
file:/tmp/test.jar!/data/level
116
     0 Thu Nov 11 00:36:14 PST 2010 META-INF/
    40 Thu Nov 11 00:36:14 PST 2010 META-INF/MANIFEST.MF
  1362 Thu Nov 11 00:35:46 PST 2010 test.class
     0 Wed Nov 10 07:53:18 PST 2010 data/
     0 Wed Nov 10 07:53:28 PST 2010 data/level/
     5 Wed Nov 10 07:53:28 PST 2010 data/level/test
jcomeau@intrepid:/tmp$ 

I'm too tired to continue, but main() prints 116, which is the ASCII value of "t", the result of read() which reads in the first byte. That should be enough to prove that getResourceAsStream() will enable you to access your resources. There ought to be a way to do it with File() also, but the path returned is strange with that '!' separating the path to the jarfile with the path inside the jarfile. I've never dealt with that before.

终弃我 2024-10-08 21:50:04
Enumeration<URL> resources = getClass().getClassLoader().getResources("data/level");
System.out.println("exists = " + resources.hasMoreElements());
Enumeration<URL> resources = getClass().getClassLoader().getResources("data/level");
System.out.println("exists = " + resources.hasMoreElements());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文