我正在使用类加载器加载我的属性文件,如下所示。
Properties prop = new Properties();
prop.load(MyClass.class.getResourseAsStream("/Property.properties"));
现在,使用此方法,我可以读取属性文件。我想写一些数据到属性文件。我不知道属性文件的路径。如何将数据存储到属性文件呢?
更新
我尝试了以下方法,但它并没有给我正确的路径:
File propFile = new File("Property.properties");
System.out.println(propFile.getAbsolutePath());
答案 0 :(得分: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());
}
但是在所有情况下都不会起作用。
我会将修改后的值写入一个众所周知的位置的文件中,并使用捆绑的属性作为默认值,由文件中的值覆盖。
答案 1 :(得分:1)
您的问题分为两部分。
首先,阅读部分。你说:"我正在加载我的属性文件......"使用您提供的代码。此代码将文件视为"资源"并使用类加载器加载它。 Java Runtime中的类加载器机制如下所示。粗略地说,此机制在您的应用程序的当前类路径中搜索它,并使与您的代码可用的第一个匹配资源相关联的输入流。在您的情况下可能没问题,但是,您应该意识到如果类路径的不同部分中存在多个同名的属性文件(例如,具有相同配置文件的不同JAR文件),那么您可能不知道哪个文件是正在阅读确保从类路径中读取正确文件的唯一方法是确保将该配置文件放在应用程序类路径中的唯一位置。
这似乎对你有用。从文件读取比写入文件更容易。
在第二部分中,您要写入文件。请注意,您应该知道要写入的文件的确切位置,这一点非常重要。如果您不知不觉地将其转换为输出流,那么您最终可能会尝试写入您不允许写入的流。因此,在这里,您应该尝试查找实际物理文件的位置(路径),例如,在计算机的硬盘上。在编写和运行此程序之前,您应该了解该路径。请记住,文件始终存在于文件夹或目录中。
您的尝试:
File propFile = new File("Property.properties");
System.out.println(propFile.getAbsolutePath());
查找要写入的文件的位置或路径失败,因为当您执行new File("Property.properties");
时,Java会尝试引用驻留在该文件中的文件(对操作系统不做任何操作) Java Runtime的当前工作目录。这是指System.getProperty("user.dir")
给出的位置。因此,您的propFile
引用该文件夹中的(假设)文件,并且对getAbsolutePath()
的调用将打印其路径。这不是您想要的文件,因为您正在尝试写入您不知道其路径的文件。因此,您应该找到文件的路径,然后使用由BufferedWriter
支持的FileWriter
或BufferedOutputStream
支持的FileOutputStream
来写入此文件。确保您要写入的文件存在,并且您有权写入该文件。
答案 2 :(得分:0)
基本上将资源作为OutputStream获取,然后将其传递给Properties对象的store()方法。
详细信息:
http://www.drdobbs.com/jvm/readwrite-properties-files-in-java/231000005