Java 无法编辑通过Class.getResource()加载的属性文件

Java 无法编辑通过Class.getResource()加载的属性文件,java,properties,classloader,Java,Properties,Classloader,我正在尝试编写一个方法,该方法将使用Class.getResource()读取属性文件,对其值进行更改,然后保存该文件 public void saveDBConnectionValues(String user, String password, String host, int port) throws IOException, URISyntaxException { Properties dbProperties = new Properties(); File f =

我正在尝试编写一个方法,该方法将使用Class.getResource()读取属性文件,对其值进行更改,然后保存该文件

public void saveDBConnectionValues(String user, String password, String host, int port) throws IOException, URISyntaxException
{
    Properties dbProperties = new Properties();

    File f = new File(this.getClass().getResource("db.properties").toURI());

    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f))));     

    dbProperties.load(reader);

    reader.close();

    dbProperties.setProperty("user", user);
    dbProperties.setProperty("pw", password);
    dbProperties.setProperty("host", host);
    dbProperties.setProperty("port", Integer.toString(port));

    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)))

    dbProperties.store(writer, null);

    writer.close();

}
我的db.properties文件已正确读取,但store方法在这里似乎不起作用。有人能解释一下为什么这不起作用,我需要做什么才能让它起作用


谢谢

资源和文件是两码事。资源从类加载器加载,并在类路径中找到。它可以从文件系统、jar或套接字(或任何其他位置,具体取决于类加载器)加载。写入资源没有意义


如果要从/向文件读写,请不要使用资源。使用文件流或读/写器。

我在本地尝试了您的代码片段,效果良好。 唯一需要考虑的是,因为加载的资源是.class文件,所以您应该在那里查找属性文件,而不是.java文件所在的位置

要找到路径,您可以这样做

final FileOutputStream outStream = new FileOutputStream(f);
System.out.println(f.getAbsolutePath()); // <-- add this line
final FileOutputStream outStream=新FileOutputStream(f);

System.out.println(f.getAbsolutePath());// 当代码被导出到Jar时,您是否正在尝试此代码?因为如果你是,JAR是一种存档的形式,因此内容不容易修改。基本上,您可以读取JAR中的文件,但不能写入

因此,即使代码目前不是JAR的形式,您也不应该真正尝试做您正在做的事情。不幸的是,无论如何,这是不可能的——正如我自己在无数次尝试后发现的那样


但是,如果能听到错误的确切含义,那就太好了。例如,您是否捕获到任何异常?

在尝试写入同一文件之前,您是否尝试过明确关闭读取链(BufferedReader和al.)?是的,我尝试过。没有什么不同。如果此代码存在于webapp中,可能您根本没有在该特定目录中写入的权限(尤其是在webapp结构本身中)。您可以尝试使用webapp之外的硬编码路径吗?参考上面的代码,调用f.canWrite()会生成
true
这是一个要点。你如何测试你的代码?在IDE中,通过导出到JAR,或以小程序的形式将其联机,等等?我使用getResource()获取URL,以便创建一个用于读/写的文件。这还不够好吗?为什么?因为一旦你将类打包到一个jar中,代码就会中断。如果要使用文件系统,请使用文件IO类。