Apache Commons Configuration2如何从InputStream中读取数据

5
我该如何使用Apache Commons Configuration2从InputStream中读取数据?
FileBasedConfigurationBuilder<XMLConfiguration> builder = 
    new FileBasedConfigurationBuilder<XMLConfiguration>(XMLConfiguration.class)
        .configure(
            new Parameters()
            .xml()
            .setFileName("")
            .setExpressionEngine(new XPathExpressionEngine())
        );

XMLConfiguration config = builder.getConfiguration();
config.read(sourceJarFile.getInputStream(sourcePropertiesEntry))

提供上述代码,如果传入空字符串给setFileName方法,将会获得以下异常。
org.apache.commons.configuration2.ex.ConfigurationException: Could not locate: org.apache.commons.configuration2.io.FileLocator@61dc03ce[fileName=tmp.xml,basePath=<null>,sourceURL=,encoding=<null>,fileSystem=<null>,locationStrategy=<null>]
at org.apache.commons.configuration2.io.FileLocatorUtils.locateOrThrow(FileLocatorUtils.java:346)
at org.apache.commons.configuration2.io.FileHandler.load(FileHandler.java:972)
at org.apache.commons.configuration2.io.FileHandler.load(FileHandler.java:702)
at org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder.initFileHandler(FileBasedConfigurationBuilder.java:312)
at org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder.initResultInstance(FileBasedConfigurationBuilder.java:291)
at org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder.initResultInstance(FileBasedConfigurationBuilder.java:60)
at org.apache.commons.configuration2.builder.BasicConfigurationBuilder.createResult(BasicConfigurationBuilder.java:421)
at org.apache.commons.configuration2.builder.BasicConfigurationBuilder.getConfiguration(BasicConfigurationBuilder.java:285)
at com.test.installer.App.getXMLConfigurationProperties(App.java:185)

如果我传入null值或者没有调用setFileName()方法,那么在read()方法处会抛出无法加载配置文件的异常。
org.apache.commons.configuration2.ex.ConfigurationException: Unable to load the configuration
    at org.apache.commons.configuration2.XMLConfiguration.load(XMLConfiguration.java:986)
    at org.apache.commons.configuration2.XMLConfiguration.read(XMLConfiguration.java:954)
    at com.test.installer.App.updateExistedProperties(App.java:84)
3个回答

3

来自API文档中的示例:

设置文件参数(编码等):

   FileBasedBuilderParameters fileparams = ...    
   FileBasedConfigurationBuilder<PropertiesConfiguration> builder =
                    new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class).configure(fileparams);

然后:
FileBasedConfiguration config = builder.getConfiguration();
FileHandler fileHandler = new FileHandler(config);
Inputstream istream = ...
fileHandler.load(istream);

请注意,您不能使用自动保存功能。如果要保存,可能需要提供一个OutputStream。例如:
fh.save(ostream)

2

从输入流(在commons-collections 2.x中)加载XML配置数据的正确方法如下:

XMLConfiguration cfg = new BasicConfigurationBuilder<>(XMLConfiguration.class).configure(new Parameters().xml()).getConfiguration();
FileHandler fh = new FileHandler(cfg);
fh.load(inputStream);

在调用load()后,cfg将包含已加载的配置。

另外注意,不应使用XMLConfiguration.read()方法,因为该方法是为内部使用而设计的,并且可能会在未来重命名为_read()(参见:https://issues.apache.org/jira/browse/CONFIGURATION-641)。


0
你可以使用 XMLConfiguration.read(InputStream in),但据我所知,你需要在某个地方有一个 XML 文件。原因是当你从构建器获取配置或调用上面的 read 方法时,在私有的 load 方法中会进行一些检查(源文件中的 XMLConfiguration.java 的第 963 行)。
    Parameters params = new Parameters();
    FileBasedConfigurationBuilder<XMLConfiguration> fileBuilder =
            new FileBasedConfigurationBuilder<>(XMLConfiguration.class)
            .configure(params.fileBased().setFileName("/tmp/dummy.xml"));`

    XMLConfiguration xmlConfiguration = fileBuilder.getConfiguration();
    xmlConfiguration.read(inputStream);

虚拟文件可以是任何格式,只要它是格式良好的,就不需要有效。在我的情况下,/tmp/dummy.xml 只包含 <_/>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接