Java jar中的文件加载

Java jar中的文件加载,java,file-io,properties,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);

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

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()
如->

因此,当我使用toURI()并运行它(jar文件)时,它会大声说
URI不是分层的

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

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

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

如果需要再次保存这些属性,则不能将它们轻松地保存在jar文件中。每次保存时都需要重新生成jar文件-单击

如果你真的需要这两个文件,你可能需要考虑在你第一次需要保存的时候创建一个文件:当加载时,如果文件存在,就使用它,否则使用JAR文件中的版本。 编辑:如果您正在构建一个桌面应用程序,而这些基本上是用户的首选项,那么您应该查看。如果存储密码,也要非常小心。。。尽可能避免这样做。

如果您只需要加载属性,则根本不应该使用
文件
——您应该使用
getResourceAsStream

如果需要再次保存这些属性,则不能将它们轻松地保存在jar文件中。每次保存时都需要重新生成jar文件-单击

如果你真的需要这两个文件,你可能需要考虑在你第一次需要保存的时候创建一个文件:当加载时,如果文件存在,就使用它,否则使用JAR文件中的版本。 编辑:如果您正在构建一个桌面应用程序,而这些基本上是用户的首选项,那么您应该查看。如果存储密码,也要非常小心。。。尽可能避免这样做。

尝试:

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并非每次都在每台机器上运行,但它应该在每台机器旁边运行。)

尝试:

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并非每次都在每台机器上工作,但它应该在每台机器旁边工作。)

@cypronmaya:为什么程序需要修改jar文件?我想您需要重新审视需求/设计。考虑一下jar不可写的情况。@ Jayan,我正在尝试构建一个桌面应用程序,其中一些参数是由用户设置的,比如用户名/密码等,有点,我想使用属性文件BEOZZ更容易。@ CyPyMaya:你可以在jar中有一些缺省属性。将修改后的内容保存到其他地方,比如${user.home}。@cypronmaya-Jayan是对的,请看下面我的答案,以获得一个应该可以工作的实现。@cypronmaya:为什么程序需要修改jar文件?我想您需要重新审视需求/设计。考虑一下jar不可写的情况。@ Jayan,我正在尝试构建一个桌面应用程序,其中一些参数是由用户设置的,比如用户名/密码等,有点,我想使用属性文件BEOZZ更容易。@ CyPyMaya:你可以在jar中有一些缺省属性。将修改后的内容保存到其他地方,比如${user.home}。@cypronmaya-Jayan是对的,请看下面我的答案,看看是否有一个可行的实现。您是否介意详细说明最后一部分“如果您真的需要两者……”@cypronmaya:您不明白其中哪一点建议?您确实需要保存更改吗?假设您不想重写JAR文件,您是否有适当的地方可以保存新的属性文件?无论如何,我不能这样做,是的,我需要将更改保存到一个临时文件,直到程序关闭等等,@cypronmaya:为什么你不能这样做?如果您只需要在程序关闭前进行更改,为什么不能将它们保存在内存中?为什么要使用文件?你介意详细说明最后一部分“如果你真的需要两者……”@cypronmaya:你不明白哪一点建议?您确实需要保存更改吗?假设您不想重写JAR文件,您是否有适当的地方可以保存新的属性文件?无论如何,我不能这样做,是的,我需要将更改保存到一个临时文件,直到程序关闭等等,@cypronmaya:为什么你不能这样做?如果您只需要在程序关闭前进行更改,为什么不能将它们保存在内存中?为什么要使用文件?“user.home不能在所有平台上工作。”这对我来说是个新闻。它以什么方式“不起作用”?在哪个平台上?@AndrewThompson我已经看到它不起作用了。虽然“平台”在这里是一个错误的词(我将对其进行编辑),但请将此问题视为一个示例:“user.home并非在所有平台上都起作用。”这对我来说是一条新闻。它以什么方式“不起作用”?在哪个平台上?@AndrewThompson我已经看到它不起作用了。虽然“平台”在这里是一个错误的词(我将对其进行编辑),但请将此问题作为示例: