在不知道的情况下用Java写入属性文件';s路径

在不知道的情况下用Java写入属性文件';s路径,java,properties-file,Java,Properties File,我使用类加载器加载属性文件,如下所示 Properties prop = new Properties(); prop.load(MyClass.class.getResourseAsStream("/Property.properties")); 现在,使用此方法,我可以读取属性文件。我想将一些数据写入属性文件。我不知道属性文件的路径。那么如何将数据存储到属性文件中 更新 我尝试了以下方法,但没有给出正确的路径: File propFile = new File("Property.prop

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

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()方法

详情如下:


你的问题有两个部分

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

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

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

您的尝试:

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

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

非常感谢。这对我有用。它甚至可以在将我的应用程序部署到Tomcat服务器之后工作。最初,正如我在问题代码中提到的,我没有使用FileInputStream,因为我不知道我的文件存储在哪里。但是在使用您的方法之前,我首先找到了文件的路径,然后分别使用FileInputStream和FileOutputStream对属性文件进行了正常的读写。我感谢你的详细解释。从一开始,我只想找到文件的路径。当我将应用程序部署到Tomcat服务器时,我无法获得文件的相对路径。因为tomcat将资源存储在WEB-INF/classes目录中。但是使用@JP Moresmau建议的方法,我能够获得路径,然后在FileInputStream和FileOutputStream中使用它。用于在不对我的应用程序进行重大更改的情况下读取和写入配置文件。也谢谢你澄清了我的想法。