2012-04-13 96 views
1

我加载一个道具,并将其保存文件加载

File propfile=new File(getClass().getResource("credentials.properties").toURI()); 
       prop.load(new FileInputStream(propfile)); 
      prop.setProperty("a", username); 
      prop.setProperty("c", password); 
      prop.setProperty("b", pbKey); 
      prop.store(new FileOutputStream(propfile), null); 

当我正常运行这在NetBeans以其优良的,当其捆绑到.jar文件,它抛出

Caused by: java.lang.IllegalArgumentException: URI is not hierarchical 
    at java.io.File.(Unknown Source) 

现在,当我使用

getClass().getResourceAsStream("credentials.properties"); 

我可以阅读FIL E,但我无法保存文件,除非我用的是.toURI() 在 - >Storing changes in .properties file that has been read via getClass().getResourceAsStream

所以当我使用toURI(),当我运行它(jar文件),它会大叫说的URI is not hierarchical

当我使用getResourceAsStream,我无法保存文件

我该怎么办? 属性文件在同一个包中的类是在

+0

@ cypronmaya:为什么程序需要修改jar文件?我想你需要重新审视需求/设计。考虑一下这个jar根本不可写的情况。 – Jayan 2012-04-13 07:48:28

+0

@Jayan我试图建立一个桌面应用程序,其中一些参数由用户设置,如他们的用户名/密码等,有点,实施,我想使用属性文件becoz更容易。 – cypronmaya 2012-04-13 07:52:04

+0

@ cypronmaya:您可以在jar中的属性中设置某种默认值。将修改后的内容另存到其他位置,例如$ {user.home}。 – Jayan 2012-04-13 07:54:50

回答

4

如果你只需要负载的属性,你不应该使用File在所有 - 你应该使用getResourceAsStream

如果您需要保存属性返回,您不能轻易地将它们放入jar文件中。你需要在每次保存时重建jar文件 - ick!

如果你真的两者都需要,你可能要考虑具有创建第一次您需要保存更改的文件:加载时,使用的文件,如果它的存在,但在jar文件中使用的版本除此以外。

编辑:如果你正在建立一个桌面应用程序,这些基本上是用户的喜好,你应该看看Preferences API。如果你正在存储密码,也要小心 ......如果可能,请避免这样做。

+0

你会介意,如果你可以详细说明最后一部分'如果你真的需要这两个.......' – cypronmaya 2012-04-13 07:49:49

+0

@cypronmaya:你不明白哪一点建议?你确实需要保存更改吗?假设你*不想*开始重写jar文件,你有适当的地方可以保存新的属性文件吗? – 2012-04-13 07:52:14

+0

你说'你可能想考虑让你第一次创建一个文件,你需要保存更改'以保存更改?我无法做到这一点,是的,我需要保存更改至少临时文件,直到程序关闭等, – cypronmaya 2012-04-13 07:56:08

1

尝试:

File userFile = new File(System.getProperty("user.home"), "myProgram.properties"); 
if(userFile.exists()) { 
    prop.load(new FileInputStream(userFile)); 
} else { 
    prop.load(getClass().getResourceAsStream("credentials.properties")); 
} 

prop.setProperty("a", username); 
prop.setProperty("c", password); 
prop.setProperty("b", pbKey); 
prop.store(new FileOutputStream(userFile), null); 

(注意的user.home不起作用每次每台机器上,但接下来应该努力每一次。)

+1

*“user.home不适用于所有平台。”*新闻给我。它以什么方式“不起作用”?在哪些平台上? – 2012-04-13 08:04:33

+0

@AndrewThompson我已经看到它不工作了。虽然'平台'在这里是错误的词(我会编辑它)看到这个问题作为例子:http://stackoverflow.com/questions/1503284/java-system-getpropertyuser-home-returns – 2012-04-13 08:06:47