2012-04-13 51 views
0

我的程序有一個從資源讀取/寫入文件的功能。這個功能我已經測試過了。例如,我寫了一些文件,重新啓動並重新加載,我可以再次讀取這些數據。Java:部署後在資源中保存文件時出錯

但是當我導出到jar文件後,我寫文件時遇到了問題。這裏是我的代碼寫入文件:

URL resourceUrl = getClass().getResource("/resource/data.sav"); 
File file = new File(resourceUrl.toURI()); 
FileOutputStream output = new FileOutputStream(file); 
ObjectOutputStream writer = new ObjectOutputStream(output); 

當這個代碼運行,我在命令提示符通知錯誤: my error 所以,我的數據無法保存。 (我知道它,因爲我重新啓動應用程序後,沒有什麼改變!!!)

請幫我解決這個問題。

謝謝:)

+0

難道你不能複製該堆棧跟蹤並粘貼爲文本嗎? – adarshr 2012-04-13 12:01:52

+0

我認爲主要的問題是,在開發過程中,您正在寫入一個真實的文件,而在「生產」過程中,所有內容都被打亂了,而您的資源是一個無法寫入的jar文件。 – 2012-04-13 12:02:25

回答

2

你根本無法以這種方式將文件寫入jar文件。您從getResource()獲得的URI不是file:/// URI,它不能傳遞給java.io.File's構造函數。編寫zip文件的唯一方法是使用java.util.zip中爲此目的設計的類,這些類旨在讓您編寫整個jar文件,而不是將數據流式傳輸到一個文件中。在真實的安裝中,無論如何,用戶可能甚至沒有權限寫入jar文件。

您將需要通過使用首選項API將數據保存到文件系統上的實際文件中,或者如果足夠小,可能會將其保存到文件系統中。

+0

你能告訴我更多關於java.util.zip的信息嗎?你的意思是我解壓縮文件並再次寫入並解壓縮? – hqt 2012-04-13 12:27:11

+0

嗯,我的意思是你放棄了更新jar文件的想法。正如我所說的,你的程序甚至可能沒有適當的權限來執行此操作。其他地方保存你的數據! – 2012-04-13 12:35:42

-2

您需要讀取/寫入文件作爲輸入流以從jar文件讀取。

public static String getValue(String key) 
    { 
     String _value = null; 
     try 
     { 
      InputStream loadedFile = ConfigReader.class.getClassLoader().getResourceAsStream(configFileName); 
      if(loadedFile == null) throw new Exception("Error: Could not load the file as a stream!"); 
      props.load(loadedFile); 
     } 
     catch(Exception ex){ 
      try { 
       System.out.println(ex.getMessage()); 
       props.load(new FileInputStream(configFileName)); 
      } catch (FileNotFoundException e) { 
       ExceptionWriter.LogException(e); 
      } catch (IOException e) { 
       ExceptionWriter.LogException(e); 
      } 
     } 
     _value = props.getProperty(key); 
     if(_value == null || _value.equals("")) System.out.println("Null value supplied for key: "+key); 
     return _value; 
    } 
+0

getResourceAsStream()將幫助讀取文件,我同意 - 但他將無法寫入文件,因此無論如何需要完全不同的方法 – 2012-04-13 12:06:38