2

Как я могу прочитать данные из InputStream с помощью Apache Commons Configuration2?Конфигурация Apache Commons2 как читать данные из 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 (строка 963 в XMLConfiguration.java in the source files).

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. Что-то вроде:

config.save(ostream) 
0

Правильный способ загрузки данных конфигурации XML из входного потока (в Викисклада коллекции 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).