2013-01-20 43 views
1

可能重複:
How can a Java program use files inside the .jar for read and write?在可運行jar中加載和保存資源?

我在創作遊戲的過程中,我想這一切從運行的JAR文件運行,所以我所有的資源(圖片和文本文件)將在jar文件中。

我遇到的問題是處理jar內的文件非常困難。

我正在使用eclipse,它有時可以在你身上玩技巧,因爲如果你從eclipse運行它,它會找到這些文件,但是如果你導出它不會。

我只是想基本上都知道露水的幾件事情的正確方法:

  1. 我需要能夠加載圖像(這是我的工作,不知何故,我有點與它修修補補,並做到了在意外,所以我不知道它是如何工作的)
  2. 我需要能夠從文本文件中讀取(我也有這個工作,再次,偶然和猜測時間)
  3. 我需要能夠寫入存在的文本文件,並且位於jar中。這是讓我覺得我做錯了一切的原因。我所要做的就是能夠保存某些設置,以便在下一次加載時工作,並且我不知道如何寫入文件。

在eclipse(Indigo)中,我製作了一個文件夾名稱「resources」,並將其標記爲源文件夾。我把所有的圖像和文本文件放在那裏。 我讀了相似圖片:

public static Image ammo = new ImageIcon(TankMazeGame.class.getResource("ammo.png")).getImage(); 

我讀的文本文件是這樣的:

InputStream is = TankMazeRunner.class.getClassLoader().getResourceAsStream("Settings.txt"); 
Scanner settingsReader = new Scanner(new InputStreamReader(is)); 

我寫我的設置文件這樣的,但它不是真正的工作,所以這就是我需要幫助。

File settingsFile = new File(DisplayMenu.class.getClassLoader().getResource("Settings.txt").getFile()); 
try { 
    OutputStream os = new FileOutputStream(settingsFile, true); 
    PrintWriter pw = new PrintWriter(os, true); 
    pw.write("SIZE: " + TankMazeRunner.WIDTH + "\n"); 
    os.flush(); 
    pw.close(); 
} catch (Exception e2) { 
    System.out.println("Error"); 
} 

正如你可能從我的代碼告訴我,我迷路了。

+0

資源文件夾中有一個Settings.txt文件。我只需要一種方法來寫入它。從它讀取應該沒問題,除非我做了一切錯誤或有更好的方法。 – Monkeybro10

+0

從類路徑中讀取圖像和默認設置應該沒問題,但是如何將設置寫入jar外的衆所周知的位置(jar旁邊?特別命名爲temp dir?)。然後,當你閱讀設置時,你會看到衆所周知的文件,缺乏你回退到默認值? – Charlie

+1

請參見[Java程序如何使用.jar中的文件進行讀取和寫入?](http://stackoverflow.com/q/5052311/418556)以[embedded-resource](http:// stackoverflow.com/tags/embedded-resource/info)。 –

回答

1

您如何將設置寫入JAR之外的衆所周知的位置?

至於保存設置方案,考慮這兩種方法之一:

  • java.util.prefs.Preferences,提到here

  • JWS PersistenceService,描述爲here

  • 餅乾,在Accessing Cookies討論。

+0

我真的不知道爲什麼我把它放在罐子裏。我決定創建一個數據文件夾,以便在您更改設置時創建。我以後會用它來存儲自定義關卡和內容。無論如何,他們會更容易進入。 – Monkeybro10

+0

我總是看起來像個好主意,起初:-)擁抱替代品的榮譽。 – trashgod

3

對於其他人遇到此問題。

除非您可以對正在使用的操作系統設置約束條件,否則您無法這樣做,即使這樣您也可能無法執行此操作。

這裏有一些制約因素需要注意的:

  • 的Microsoft Windows實現了自己的讀寫鎖symmantics:同時有一個讀處理打開你不能寫入文件。 JVM將有一個讀取句柄,因爲這是類路徑中的文件,所以在Java中不可能(除非你想分叉一個臨時進程,自殺,讓臨時進程重寫並重新啓動......哪個會變得醜陋反病毒可能會停止臨時過程)

  • 儘管JVM在JAR文件中有緩存偏移量,但大部分unix OS實現都沒有問題,所以一旦完成,程序就會崩潰並嘗試加載一個類。

  • 只有Windows用戶傾向於不使用文件權限來鎖定對可執行文件的寫入訪問權限,因此假設您對該jar具有寫入權限是無效的。

第二點,有你在水中所有OS impls死了(除非你可以用叉子生活,和叉使得很多反正危險的假設)

只寫一個單獨的文件並完成。

+1

+1對於寶貴的背景;更多[這裏](http://stackoverflow.com/q/1224817/230513)和[重複](http://stackoverflow.com/questions/5052311/how-can-a-java-program-use-files - 內部最罐子換讀取和寫入)。 – trashgod