在不知道其路径的情况下写入 Java 中的属性文件

Write to Properties File in Java without knowing it's path

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

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

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

更新

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

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

我认为您不能以一种始终有效的通用方式进行操作,因为您的属性文件可能会捆绑在一个 jar 等中。您可以通过 getResource(String) 获取 URL 然后对那个 URL 做点什么,例如如果它是一个文件 URL,你可以在那里得到文件名。

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

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

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

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

详情在这里:

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

你的问题分为两部分。

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

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

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

您的尝试:

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

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