当前位置: 首页 > 知识库问答 >
问题:

自动连线列表与未知键长度的属性文件

闾丘炫明
2023-03-14

是否有方法自动关联从属性文件读取的另一个列表中包含字符串的列表?我发现的困难是属性值需要拆分成字符串列表(或数组),然后自动连接到。我的属性文件如下所示:

jobFolders1=C:/Temp/originFolder, C:/Temp/trafoIn, C:/Temp/trafoOut, C:/Temp/destinationFolder
jobFolders2=C:/Temp/originFolder2, C:/Temp/trafoIn2, C:/Temp/trafoOut2, C:/Temp/destinationFolder2

现在,我希望我的用户能够添加行到该文件,每当有新的作业。所以我从来不知道钥匙的名字,也不知道行数。有什么方法可以自动连接文件条目到列表中,该列表本身包含包含4个字符串的列表(由“,”分割)?也许这整个方法不是最好的。如果有,请随时告诉我。

共有3个答案

强才捷
2023-03-14

您可以做的是将所有作业的所有目录存储在一个值中。作业将由一个特殊字符分隔,该字符肯定不会在任何目录名中使用。

为了保持其可读性,可以使用多行属性值。例如,使用|(管道)作为分隔符:

# Starting with a line break for readability.
# Looks nice, but the first array value will be empty.
# Just leave it out if you don't want this.
jobFolders=|\
    C:/Temp/originFolder, C:/Temp/trafoIn, C:/Temp/trafoOut, C:/Temp/destinationFolder|\
    C:/Temp/originFolder2, C:/Temp/trafoIn2, C:/Temp/trafoOut2, C:/Temp/destinationFolder2

在代码中,您可以简单地应用

String[] jobs = jobFolders.split("|");

设置为值以获取所有作业配置的数组。

旁注:分隔符可以是任何保留的文件名字符,但请确保选择一个在目标平台上肯定无效的字符。有关更多信息,请阅读维基百科文章。

我在示例中使用了|,这在comma操作系统的文件名中是不允许的,但在Unix文件名中可能是允许的。

云文栋
2023-03-14

您可以使用apachecommons配置。getKeys()方法将为您提供配置中包含的键的列表。刷新策略确保您能够动态加载运行时添加的新属性。为了您的方便,我已经编写了一个示例,但尚未对其进行测试。

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.log4j.Logger;

public class SystemProperties {

    private static final Logger LOG = Logger.getLogger(SystemProperties.class.getSimpleName());;

    private static SystemProperties singleton = new SystemProperties();

    private PropertiesConfiguration conf = null;
    private final FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy();

    private static final long REFRESH_INTERVAL = 2000;

    private final String configurationFilePath = "/my-properties-files/system.properties";

    private SystemProperties() 
    {
        conf = new PropertiesConfiguration();
        conf.setDelimiterParsingDisabled(true);

        if (conf.getFile() == null) 
        {
            try {
                URL url = getClass().getResource(configurationFilePath);

                File configurationFile = new File(url.getFile());
                InputStream in = new FileInputStream(url.getFile());
                conf.load(in);
                conf.setFile(configurationFile);
            } catch (final Exception ex) {
                LOG.error("SystemProperties: Could not load properties file ", ex);
            }
        }

        if (conf.getFile() == null) 
        {
            LOG.warn("File could not be loaded");
        }

        strategy.setRefreshDelay(REFRESH_INTERVAL);
        conf.setReloadingStrategy(strategy);
        conf.setAutoSave(true);
    }

    public static SystemProperties getInstance() 
    {
        return singleton;
    }

    public String get(String s) 
    {
        return conf.getString(s);
    }

    public List<String> getKeys() 
    {
        @SuppressWarnings("unchecked")
        final Iterator<String> keysIterator = conf.getKeys();
        if (keysIterator != null) {
            final List<String> keysList = new ArrayList<String>();
            while(keysIterator.hasNext()) {
                keysList.add(keysIterator.next());
            }
            return keysList; 
        }
        return Collections.emptyList();
    }

    public void setProperty(String property, String value) throws Exception 
    {
        conf.setProperty(property, value);
    }
}
徐丰茂
2023-03-14

好吧,下面是一个相当有弹性的解决方案,尽管我认为可以更优雅地解决这个问题(根本不需要编写自定义代码):

写一个属性映射:

@Component("PropertyMapper")
public class PropertyMapper {

@Autowired
ApplicationContext context;
@Autowired
List<List<String>> split;

public List<List<String>> splitValues(final String beanname) {
((Properties) this.context.getBean(beanname)).values().forEach(v -> {
final List<String> paths = Arrays.asList(((String) v).split(","));
paths.forEach(p -> paths.set(paths.indexOf(p), p.trim()));
this.split.add(paths);
});
return this.split;
}

在context.xml中加载属性,如下所示:

<util:properties id="testProps" location="classpath:test.properties"/>

然后使用Spring EL通过调用splitValues方法“调整”原始值,将值连接到字段:

@Value("#{PropertyMapper.splitValues('testProps')}")
private List<List<String>> allPaths;
 类似资料:
  • 出于某种原因,我使用外部属性源,其中一个外部属性源没有自动连接,在创建身份验证bean时接收空指针 原因: org.springframework.beans.BeanInstantiationException: Failed to instanceiate [com.filechecker.check.Authenticator]: Constructor threw exception;ne

  • 本文向大家介绍iOS 来自未知文本长度的动态标签框架,包括了iOS 来自未知文本长度的动态标签框架的使用技巧和注意事项,需要的朋友参考一下 示例 有时,我们必须根据未知文本长度的动态内容来调整UILabel的大小。在此示例中,UILabel的宽度固定为280个点,而高度则是无限的,比方说为9999。根据文本样式和maximumLabelSize估算框架。 目标C 迅速            

  • 问题内容: 我知道这是一个很普遍的问题,我在Stack Overflow和其他网站(包括datatables网站)上阅读了所有类似的问题。 为了澄清,我正在使用 PHP Codeigniter 物质学 我还确保我正确接收了JSON数组: 我的HTML表格如下所示: 这是我的功能: 我得到的错误是 未捕获的TypeError:无法读取未定义的属性’length’ 问题答案: 原因 此错误通常意味着j

  • 我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

  • 问题内容: 我是Angular的新手,我需要一些项目起点。如何通过在后台单击鼠标从ajax数据创建新表?我知道ajax数据的列数未知,并且有时会有所不同。 例如: 问题答案: 您基本上可以通过以下方式使用两个嵌套的ng-repeats: 在控制器中: 然后在某个地方调用loadNew(),例如。 示例:http: //jsfiddle.net/v6ruo7mj/1/