【问题标题】:Write to Properties File in Java without knowing it's path在不知道路径的情况下写入 Java 中的属性文件
【发布时间】:2016-02-29 20:09:14
【问题描述】:

我正在使用类加载器加载我的属性文件,如下所示。

Properties prop = new Properties();
prop.load(MyClass.class.getResourseAsStream("/Property.properties"));

现在,使用这种方法我可以读取属性文件。我想将一些数据写入属性文件。我不知道属性文件的路径。那么如何将数据存储到属性文件中呢?

更新

我尝试了以下方法,但它没有给我正确的路径:

File propFile = new File("Property.properties");
System.out.println(propFile.getAbsolutePath());

【问题讨论】:

    标签: java properties-file


    【解决方案1】:

    我认为您不能以一种始终有效的通用方式,因为您的属性文件可以捆绑在一个 jar 等中。您可以通过 getResource(String) 获取 URL,然后使用该 URL 执行某些操作,例如,如果它是一个文件 URL,您可以在那里获取文件名。

     URL u=MyClass.class.getResource("/Property.properties");
     if ("file".equals(u.getProtocol()){
        File f=new File(u.toURI());
     }
    

    但这并不适用于所有情况。

    我会将修改后的值写入已知位置的文件中,并使用捆绑的属性作为默认值,这些属性会被文件中的值覆盖。

    【讨论】:

    • 非常感谢。 .它对我有用。它甚至在将我的应用程序部署到 Tomcat 服务器后也可以工作。最初,正如我在问题代码中提到的那样,我没有使用 FileInputStream,因为我不知道我的文件存储在哪里。但是,与使用您的方法相比,我首先找到了文件的路径,然后分别使用 FileInputStream 和 FileOutputStream 对属性文件进行正常读写。 .
    【解决方案2】:

    您的问题分为两部分。

    首先,阅读部分。您说:“我正在加载我的属性文件……”使用您提供的代码。此代码将文件视为“资源”并使用类加载器加载它。 Java 运行时中的类加载器机制在此处得以体现。粗略地说,这种机制在应用程序的当前类路径中搜索它,并使与第一个匹配资源相关联的 输入流 可用于您的代码。在您的情况下可能没问题,但是,您应该意识到,如果在类路径的不同部分中有多个同名的属性文件(例如,具有相同配置文件的不同 JAR 文件),那么您可能不知道哪个文件是被阅读。确保从类路径中读取正确文件的唯一方法是确保该配置文件位于应用程序类路径中的唯一位置。

    这似乎对你有用。从文件中读取比写入文件更容易

    在第二部分,您要写入一个文件。请务必注意,您应该知道要写入的文件的确切位置。如果您在不知不觉中将其转换为输出流,那么您最终可能会尝试写入不允许写入的流。因此,在这里,您应该尝试找到实际物理文件的位置(路径),例如,在计算机的硬盘驱动器上。在编写和运行此程序之前,您应该知道该路径。请记住,文件始终存在于文件夹或目录中。

    你的尝试:

    File propFile = new File("Property.properties");
    System.out.println(propFile.getAbsolutePath());
    

    查找要写入的文件的位置或路径失败,因为当您执行new File("Property.properties"); 时,Java 会尝试引用驻留在 Java 运行时的文件(尚未对操作系统执行任何操作)当前工作目录。这是指System.getProperty("user.dir") 给出的位置。因此,您的 propFile 指的是该文件夹中的(假设的)文件,并且对 getAbsolutePath() 的调用会打印其路径。这不是您想要的文件,因为您正在尝试写入一个您不知道其路径的文件。因此,您应该找到文件的路径,然后使用由FileWriter 支持的BufferedWriter 或由FileOutputStream 支持的BufferedOutputStream 写入该文件。确保您要写入的文件存在并且您有权写入。

    【讨论】:

    • 感谢您为这个详细的解释所做的努力。 .从一开始,我试图只找到文件的路径。当我将应用程序部署到 Tomcat 服务器时,我无法获取文件的相对路径。由于 tomcat 将资源存储在 WEB-INF/classes 目录中。 .但是使用@JP Moresmau 建议的方式,我能够获取路径,然后在 FileInputStream 和 FileOutputStream 中使用它。 .for 读取和写入配置文件而不对我的应用程序进行重大更改。 .也感谢您清除我的概念。 .
    【解决方案3】:

    基本上将资源作为 OutputStream 获取,然后将其传递给 Properties 对象的 store() 方法。

    这里有详细信息:

    http://www.drdobbs.com/jvm/readwrite-properties-files-in-java/231000005

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2019-06-17
      相关资源
      最近更新 更多