2

如何使用Apache Commons Configuration2从InputStream读取数据?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: [email protected][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) 

回答

0

您可以使用XMLConfiguration.read(InputStream in),但据我所知,你需要有一个XML文件中的某个地方。原因是,当您从构建器获取配置或调用上述read方法时,私人load方法(XMLConfiguration.java in the source files中的行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只包含<_/>

0

example in the api documenation

设置您Fileparameters(编码和这样)

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。是这样的:从输入流加载XML配置数据的

config.save(ostream) 
0

有道(在下议院的集合2.X)如下:

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)。

相关问题