【问题标题】:Apache Commons Configuration2 how to read data from InputStreamApache Commons Configuration2 如何从 InputStream 读取数据
【发布时间】:2016-09-19 13:00:46
【问题描述】:

如何使用 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)

【问题讨论】:

    标签: java apache-commons xml-configuration apache-commons-config


    【解决方案1】:

    来自example in the API documentation

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

       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】:

      从 Input Stream(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)。

      【讨论】:

        【解决方案3】:

        您可以使用 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 只包含&lt;_/&gt;

        【讨论】:

          猜你喜欢
          • 2018-01-02
          • 1970-01-01
          • 1970-01-01
          • 2017-04-16
          • 1970-01-01
          • 2016-10-22
          • 1970-01-01
          • 2010-11-18
          • 1970-01-01
          相关资源
          最近更新 更多