2010-11-11 183 views
2

好了,所以在IDE中運行偉大,並表示該文件存在,但一旦我打包成一個jar驗證碼:如何獲取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> 
+0

是否要列出jar中的目錄? – dacwe 2010-11-11 08:29:55

回答

5

通常是因爲該類你的getClass()'d是包com.something.app,所以使用相對路徑數據必須是在COM /事/程序/數據/水平。否則使用絕對路徑。

要看到東西都在你的jar文件:


jar tvf myapp.jar 

[確定,很多回往復和一些測試後] ...


[email protected]:/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 
[email protected]:/tmp$ 

我太累了繼續,但main()打印116,它是ASCII碼值「t」,read()的結果讀入第一個字節。這應該足以證明getResourceAsStream()將使您能夠訪問您的資源。應該有一種方法可以用File()來完成,但返回的路徑與'!'很相似。將路徑分隔爲這個jarfile與路徑裏面的這個jar文件。我從來沒有處理過。

+0

system.out.print-ing getClass()。getResource(「data/level」)。getPath()給我:file:/ G:/EclipsePortable/Data/workspace/Game1/phantasyblade.jar!/ data/level if這有助於。 – William 2010-11-11 06:58:39

+0

,看起來很奇怪。這就是爲什麼我使用GNU Make而不是IDE的原因。 – 2010-11-11 07:00:45

+0

你是否至少*嘗試*使用絕對路徑:/ data/level而不是數據/級別? – 2010-11-11 07:04:15

1
Enumeration<URL> resources = getClass().getClassLoader().getResources("data/level"); 
System.out.println("exists = " + resources.hasMoreElements()); 
相關問題