2017-06-09 55 views
0

通過getResourcestream成功訪問屬性文件並使用fileinputstream讀取。現在我需要在添加新屬性後覆蓋同一個文件獲取項目src中文件的路徑並將其傳遞到fileoutputstream進行覆蓋

問題:卡住獲​​取fileoutputstream覆蓋所需的相同文件的路徑。

屬性文件在src/main/resources中。,並試圖從的src/main/JAVA/COM /網頁更新/ my.class

Properties prop = new Properties(); 
    InputStream in = getClass().getClassLoader().getResourceAsStream("dme.properties"); 
    FileOutputStream out = null; 
    try { 
     prop.load(in);} // load all old properties 
    catch (IOException e) {} 
    finally {try { in.close(); } catch (IOException e) {} } 
    prop.setProperty("a", "b"); //new property 
    try { 
     out = new FileOutputStream("dme.properties"); 
     prop.store(out, null);} //overwrite 
    catch (IOException e) {} 
    finally {try {out.close();} catch (IOException e) {} } 
    } 
+1

爲什麼不能將資源作爲流獲取,只需獲取資源URL即可。然後,您可以讀取和寫入該URL。 'URL url = getClass()。getResource(「/ dme.properties」);' –

+1

不要嘗試寫入類路徑資源。它可以在你開發IDE的時候工作,但是當你從一個.jar運行時,它是不可能的。將新的屬性寫入用戶主目錄下的新文件。還*永遠*寫一個空的catch塊。至少,打印堆棧跟蹤。 – VGR

+0

我想在戰爭文件中有一個全局設置,可以由不同的用戶進行更改。除了數據庫方法之外,沒有辦法通過屬性文件來完成嗎? @VGR –

回答

0

不但得不到InputStream的,你可以得到的資源URL並用它來讀取和文件寫入從src/main/resources

Properties properties = new Properties(); 
File file = new File(this.getClass().getResource("/dme.properties").toURI()); 
try (InputStream is = new FileInputStream(file)) { 
    properties.load(is); 
} 
properties.setProperty("a", "b"); 
try (OutputStream os = new FileOutputStream(file)) { 
    properties.store(os, null); 
} 
+0

這是錯誤的。 URL.getFile()*不會將URL轉換爲文件名。它僅僅返回URL的路徑和查詢部分。 (名稱'getFile'是由於Java 1.0發佈時返回的URL的性質造成的。)如果原始文件名包含空格或URL中非法的任何其他字符,則結果將不是現有文件名。另外,從.jar文件運行時,無法將資源URL轉換爲文件。 – VGR

+0

@VGR - 感謝您的信息。我已更新爲使用正確的「文件」。另外,我不確定OP如何使用這些代碼,所以如果他們使用.jar,我明白你的觀點並不適用。我只是回答他們最初的問題。 –