写入由ClassLoader加载的Wildfly上的属性文件

时间:2015-10-23 09:04:59

标签: java java-ee properties resources wildfly

我在Wildfly应用程序服务器上加载属性,如下所示:

public String getPropertyValue(String propertyName) throws IOException {
    InputStream inputStream;
    Properties properties = new Properties();

    inputStream = getClass().getClassLoader().getResourceAsStream(propertyFileName);

    if (inputStream != null) {
        properties.load(inputStream);
    } else {
        throw new FileNotFoundException("property file '" + propertyFileName + "' not found in the classpath");
    }

    inputStream.close();
    String property = properties.getProperty(propertyName);
    LOG.debug("Property {} with value {} loaded.", propertyName, property);
    return property;
}

现在我想写同一个文件。我该怎么做?我尝试使用新的File(configurationFileName),但是在另一个目录中创建了一个新文件,我尝试使用classloader中的文件的URL / URI,但这似乎也不起作用。这样做的正确方法是什么? 求救!

3 个答案:

答案 0 :(得分:1)

你不可以,但你不应该这样做。我会使用数据库表来存储和加载属性。或者如果它应该是属性文件,则通过文件路径将其存储在外部,但不能通过类路径存储。

答案 1 :(得分:0)

try (FileOutputStream out = new FileOutputStream(new File( getClass().getClassLoader().getResource(propertyName).toURI()))){
    properties.store(out,"My Comments);
}

答案 2 :(得分:0)

Raoul Duke实际上是正确的,通过文件执行属性会引发很多问题。我很快就会切换到DB来保存它们。与此同时,我这样做:当我写属性时,它们被写入新创建的文件。当我阅读属性时,我加载了#34; old"一个,然后创建一个新的属性对象,旧的属性对象作为默认值,然后我加载新文件。

private Properties loadProperties() throws IOException {
    InputStream inputStream;
    Properties defaultProperties = new Properties();
    inputStream = getClass().getClassLoader().getResourceAsStream(defaultPropertyFileName);
    if (inputStream != null) {
        defaultProperties.load(inputStream);
    } else {
        throw new FileNotFoundException("Property file '" + defaultPropertyFileName + "' not found in the classpath");
    }
    inputStream.close();
    Properties allProps = new Properties(defaultProperties);
    try {
        allProps.load(new FileInputStream(new File(updatedPropertyFileName)));
    } catch (IOException ex) {
        LOG.error("Error loading properties: {}", ex.toString());
        return defaultProperties;
    }
    return allProps;
}

我的答案是正确的,因为我在技术上并没有写入我想要的文件,而且这只是一种解决方法,他的解决方案更好更清洁。