文件加载在jar中

时间:2012-04-13 07:40:57

标签: java file-io properties

我正在加载一个道具并保存它

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");

我可以读取该文件,但除非我使用.toURI(),否则我无法保存该文件 如在 - > Storing changes in .properties file that has been read via getClass().getResourceAsStream

所以当我使用toURI()和运行它(jar文件)时,它会喊出URI is not hierarchical

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

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

2 个答案:

答案 0 :(得分:4)

如果您只需加载属性,则根本不应使用File - 您应该使用getResourceAsStream

如果您需要再次保存属性,则无法轻松将它们放在jar文件中。每次保存时都需要重建jar文件 - ick!

如果确实需要两者,您可能需要考虑在第一次需要保存更改时创建一个文件:加载时,使用该文件(如果存在),但使用版本否则在jar文件中。

编辑:如果您正在构建桌面应用程序并且这些基本上是用户首选项,那么您应该查看Preferences API。如果您正在存储密码,也应该非常小心......如果可能的话,请避免这样做。

答案 1 :(得分: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在每台计算机上都不起作用,但每次都应该可以正常工作。)