从文件加载和保存属性

时间:2014-05-09 23:43:27

标签: java hibernate properties

在我的spring项目中,我在classpath中有一个名为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),并将此新配置保存在同一个文件中。

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

3 个答案:

答案 0 :(得分:1)

这样做吗?

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();

答案 1 :(得分:1)

  

我的classpath中有一个名为database.properties

的文件      

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

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

"文件"您尝试更新可能根本不是文件。它可能是较大的JAR或ZIP文件的组件。它可能是已下载的内容或磁盘上的缓存。它可能(假设地)使用公钥/私钥进行加密......我们没有加密"加密"键。

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

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


  

我尝试删除classpath:,但是我遇到错误引起:java.io.FileNotFoundException:类路径资源[database.properties]无法打开,因为它不存在

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

将文件复制到(例如)" /tmp/database.properties" ;,将注释更改为

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

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

答案 2 :(得分:1)

示例从文件加载道具。 我们有一个带有filename = 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();
        }

返回 value0

\ | / 73