在属性文件中复制属性时抛出异常

时间:2017-09-29 18:53:01

标签: java properties property-files

当属性文件包含重复属性时,如何抛出异常? 这是一个证明这种情况的例子:

# Properties-file

directory=D:\\media\\D-Downloads\\Errorfile\\TEST_A
directory=D:\\media\\D-Downloads\\Errorfile\\TEST_B
#directory=D:\\media\\D-Downloads\\Errorfile\\TEST_C

4 个答案:

答案 0 :(得分:2)

我想你正在阅读Properties.load()之类的文件。它使用put(key, value)在内部设置参数。您可以覆盖该方法以获得所需的行为,例如。

new Properties() {
    @Override
    public synchronized Object put(Object key, Object value) {
        if (get(key) != null) {
            throw new IllegalArgumentException(key + " already present.");
        }
        return super.put(key, value);
    }
}.load(...);

编辑:

将其整合到OP的代码中:

File propertiesFile = new File("D:/media/myProperties.properties");
Properties properties = new Properties() {
    @Override
    public synchronized Object put(Object key, Object value) {
        if (get(key) != null) {
            // or some other RuntimeException you like better...
            throw new IllegalArgumentException(key + " already present.");
        }
        return super.put(key, value);
    }
}
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(propertiesFile))) {
  properties.load(bis);

} catch (IllegalArgumentException ex) {
  //
}

顺便问一下,你为什么要抓住这个例外?如果程序配置损坏,我不会继续执行程序(可能会在顶层捕获以记录事件)。但异常处理是一个不同的主题......

(编辑:我的原始代码samles没有编译,我纠正了它们)

答案 1 :(得分:1)

如此处所述Tool to find duplicate keys and value in properties file

” 我使用了两个不错的工具

unival npm软件包:这是一个命令行工具,用于检测重复的键,值或行。

npm命令安装软件包:npm i unival

链接:https://www.npmjs.com/package/unival

unival扩展:如果使用vscode,这是一种非常有用的扩展,可以即时检测重复项。 “

最好的方法是对运行unival命令的测试,以防止重复的值进入属性文件

答案 2 :(得分:0)

Ralf Kleberhoff的回答是正确的; 但是,我不会使用匿名类。 您似乎不止一次要使用此功能, 所以我会创建一个扩展Properties的类并覆盖put和Ralf一样

请注意,put方法来自Hashtable扩展的Properties类。

这是一个例子(我没有尝试编译它):

public class UniqueProperties
extends
    Properties
{
    @Override
    public synchronized String put(String key, String value)
    {
        if (get(key) != null)
        {
            throw new IllegalArgumentException(key + " already present.");
        }

        super.put(key, value);
    }
}

答案 3 :(得分:0)

以下是我加载属性的方法:

        File propertiesFile = new File("D:/media/myProperties.properties");
    Properties properties = new Properties();
    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(propertiesFile))) {
      properties.load(bis);

    } catch (Exception ex) {
      //
    }

@Ralf如何调整代码?