Java 从文件中加载和保存属性

Java 从文件中加载和保存属性,java,hibernate,properties,Java,Hibernate,Properties,在我的spring项目中,我的类路径中有一个名为database.properties的文件,其中包含以下内容: jdbc.Classname=org.postgresql.Driver jdbc.url= jdbc.user= jdbc.pass= hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql=false hibernate.hbm2ddl.auto=validate 在我的一个服务类

在我的spring项目中,我的类路径中有一个名为database.properties的文件,其中包含以下内容:

jdbc.Classname=org.postgresql.Driver
jdbc.url=
jdbc.user=
jdbc.pass=
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=validate
在我的一个服务类中有一个方法,通过hibernate手动将数据库模式导出到服务器。此时,此方法的代码如下:

public void create_tables(String maquina, String usuario, String senha) {
    Configuration config = new Configuration();
            SchemaExport schema = new SchemaExport(config);
            schema.create(true, true);
}
我想从我的配置变量中的文件database.properties加载属性,设置我传递给该变量中的方法的值(url、user和pass),并将此新配置保存在同一文件中

任何人都可以指出这样做的方向吗?

这样做可以吗

Properties props = new Properties();
FileInputStream fis = new FileInputStream( "database.properties" );
props.load( fis );
fis.close();

props.setProperty("jdbc.url", {{urlvalue}} );
props.setProperty("jdbc.user", {{user value}} );
props.setProperty("jdbc.pass", {{pass value}} );

FileOutputStream fos = new FileOutputStream( "database.properties" );
props.store( fos );
fos.close();
我的类路径中有一个名为database.properties的文件

我想从我的配置变量中的文件database.properties加载属性,设置我传递给该变量中的方法的值(url、user和pass),并将此新配置保存在同一文件中

这至少是困难的,也许是不可能的

您试图更新的“文件”可能根本不是文件。它可能是更大的JAR或ZIP文件的一个组件。它可能是已下载内容的内存或磁盘缓存。它可能(假设)已使用公钥/私钥加密。。。我们没有“加密”密钥

除了困难之外,这是个坏主意。假设您的服务部署为WAR文件,并且属性文件在WAR中交付。您可以修改属性。。。等等然后,出于某种原因,你重新部署了战争。这将覆盖您的配置

如果您希望配置属性是可更新的,那么它们不应该位于类路径上。将文件放入一个单独的目录(webapp树之外…),并通过文件路径名或
file:
URL访问它


我尝试删除类路径:,但我面临以下错误:java.io.FileNotFoundException:无法打开类路径资源[database.properties],因为它不存在

看起来您正在使用属性文件的(不正确)相对路径

将文件复制到(比如)“/tmp/database.properties”,将注释更改为

    @PropertySource("/tmp/database.properties")

看看这是否有效。如果确实如此,那么您可以找到一个更合适的位置来存储文件。但正如我上面所说的,如果您试图更新webapp目录中的文件,那么在重新部署时,它很有可能会被破坏。所以不要把它放在那里。

示例从文件加载道具。 我们有文件名为conf.props的测试配置文件 包含:

key0=value0
key1=value1
应用程序中的下一类加载属性:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class LogProcessor {



    public void start(String fileName ) throws IOException {

        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream(fileName);
        prop.load(fis);

        System.out.println (prop.getProperty("key0"));
    }
}
如何运行:

public static void main(String[] args) {

        try {
            new LogProcessor().start();
        } catch (IOException e) {
            e.printStackTrace();
        }
返回值0


\|/73

这样,文件保存在我的主目录中,而不是更新我的类路径中的文件。另一个问题是url保存为jdbc\:postgresql\://localhost\:5432/horario?charSet\=LATIN1,而不是jdbc:postgresql:localhost:5432/horario?charSet=LATIN1。不知道为什么额外\。存储命令将转义#、!、=,和:带反斜杠的字符。这实际上是正确的编码,但如果用法不含糊,并且似乎也在解析,则可以省略它们。我不知道有什么方法可以消除自动添加反斜杠,但它应该只是表面的。在读取时,它们应该被删除。您可能需要在类路径中指定文件的完整路径。有一种方法可以使用
Class.getResourceAsStream
从类路径自动获取
InputStream
,该方法可用于读取属性文件,但没有其他方法可以获取
OutputStream
,在不知道完整路径的情况下。我需要在类路径中加载并保存文件,因为这是我在Hibernate配置类中访问文件的方式(使用注释@PropertySource(“classpath:database.properties”)。我尝试删除类路径:,但我面临由以下原因引起的错误:java.io.FileNotFoundException:class path resource[database.properties]无法打开,因为它不存在