【问题标题】:Writing to Properties file写入属性文件
【发布时间】:2023-04-01 06:02:01
【问题描述】:

试图将值写入属性文件中的参数。文件 config.properties 已经在 /src/config 文件夹下创建,我可以读取它。它只有一个参数“状态”。但是当我尝试更新/写入属性文件时,出现以下错误: java.io.FileNotFoundException: \src\config\config.properties(系统找不到指定的路径)

Properties prop = new Properties();
    prop.setProperty("status","1");
        try {
            prop.store(new FileOutputStream("/src/config/config.properties"), null);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

【问题讨论】:

  • 您确定要从 / 开始的绝对路径吗?在 / 是所有内容的根的类 unix 文件系统中,您没有写权限也就不足为奇了。换句话说:请阅读minimal reproducible example,不要告诉我们“哈,这个其他代码有效”。相反,显示所有相关的部分。
  • 以下代码用于读取属性文件。我想写入文件。属性 prop = new Properties();输入流是 = null; is=this.getClass().getResourceAsStream("/config/config.properties");尝试 { prop.load(is); } catch (IOException ex) { } String prevstatus=prop.getProperty("status");尝试 { is.close(); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); }
  • 您是否可以或想要阅读强制进入 cmets 的源代码?没有。因此,请改为编辑您的问题,并确保所有相关信息都包含在问题中!
  • (1) 您正在将属性文件作为资源读取,但尝试将其作为外部文件写入。 (2) 资源通常是只读的。

标签: java


【解决方案1】:

问题来了:

    is=this.getClass().getResourceAsStream("/config/config.properties");

这不是正常的文件系统读取。它使用相对于类路径上的目录或 JAR 文件的路径从类路径中读取 resource。路径是资源路径,不是文件系统路径。

如果你想写入那个文件:

  1. 它必须是独立文件,而不是 JAR 或 ZIP 文件条目或类似的东西。

  2. 它不能是只读的...或锁定的。

  3. 您需要知道实际绝对或相对文件系统路径名对应资源路径。 (因为资源 API 方法不提供打开资源进行写入的方法。)

相反,您尝试在打开文件进行写入时使用资源路径来识别文件。 (FileOutputStream 类需要文件系统路径。)


基本上,您将不得不重新设计它。更新资源路径上的东西通常很困难,有时甚至是不可能的。此外,您似乎在引用 /src/... 位置中的资源,部署应用程序时该位置不会出现在类路径中。 (我假设您不会期望您的用户下载、安装和学习使用 Java IDE 以便他们可以运行您的应用程序!)

更好的办法是将属性文件放入应用程序的安装目录或用户的主目录。然后你想办法让应用程序找出它在哪里。 (例如,如果您使用包装脚本启动应用程序,则该脚本可以使用 -D 选项将安装目录路径传递给您的应用程序。

另一种选择是使用 Java 设置 API,它可以将设置存储在文件系统中(特定于平台的)标准位置。

【讨论】:

    【解决方案2】:

    我需要配置构建系统,你用的是gradle、maven、ant?什么都没有?

    因为你的代码在 jar 中不起作用,因为 jar 中不存在 src 目录。

    根据您的信息,我说绝对路径可以解决您的问题,但由于您与文件系统结构耦合,所以很糟糕。

    要使用绝对路径,请查看 post,但我希望您在帖子中为您的项目添加更多信息。

    prop.store(new FileOutputStream(System.getProperty("user.dir") + "/src/config/config.properties"), null);
    

    我看了一条评论,你用this.getClass().getResourceAsStream()阅读了专有文件,它有一个不同的路径分辨率FileOutputStream

    为了解决这个问题,我们需要更多关于项目结构的信息,请修改你的问题,因为我使用绝对路径的解决方案是通用的

    【讨论】:

    • 我使用的是 Eclipse,没有任何构建系统。它是一个 Java Web 服务。试图避免绝对路径。 this.getClass().getResourceAsStream() 可以很好地读取属性文件。但我无法使用它来写入属性文件。对于原始配置文件,我通过 File->New 从 Eclipse 创建并仅提供参数 status=0。
    • 现在报错信息:java.io.FileNotFoundException: C:\Users\JohnWilson\Desktop\src\config\config.properties(系统找不到指定的路径)
    • 将文件写入网络应用程序与将文件写入桌面文件有更多不同,请查看discussion,如果您没有在帖子中添加更多信息,我们无法帮助您
    猜你喜欢
    • 2013-01-15
    • 2017-11-06
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多