文件中存在重复键值对时如何读取属性文件?

Posted

技术标签:

【中文标题】文件中存在重复键值对时如何读取属性文件?【英文标题】:How to read the property file when duplicate key-value pair exist in the file? 【发布时间】:2013-12-28 23:55:19 【问题描述】:

我正在使用属性类的load() 加载我的属性文件。我能够使用 set、hashmap、treeset、enumeration 读取属性类的键值对,但它不会检索重复的对。重复的对只检索一次。

【问题讨论】:

您的属性文件无效。键必须是唯一的。重新设计。 @EJP:如果属性文件中存在重复值,我知道它无效,这就是我想通过将每个键与其他键进行比较来显示的内容。我想创建一个方法,如果重复键存在那么它必须显示一些警报或消息,有什么办法吗? 没有什么能阻止你自己编写这样的方法,但这不是你要求的。 @EJP: 请原谅这个错误,但首先我需要从属性文件中读取所有键,即使它重复并且我无法读取重复的键,请让我知道这样做的方法....就像在我的属性文件中一样,我有 a=1,a=1,a=2 ......我想阅读所有三个 a 但我只能阅读它一次,即 a=2.... 必须自己写。你不能使用Properties.load()。 【参考方案1】:

属性文件设置键值对。所有键都是唯一的,因此它不会捕获重复的对。 相反,它将获取最新的映射对。例如:

示例文件:

a=1
b=2
c=3
d=4
a=10
c=7

属性类将返回最新的对,即

a=10
b=2
c=7
d=4

如果您的要求是查找所有对是否重复,请使用以下代码,该代码使用 Scanner 类和两个 arraylist 对象。

        ArrayList k = new ArrayList();
        ArrayList v = new ArrayList();
        Scanner scan = new Scanner(new File("E:\\abc.properties"));
        while(scan.hasNextLine()) 
            //System.out.println(scan.nextLine());
            String split[] = scan.nextLine().trim().split("=");
            if(split.length == 2) 
            k.add(split[0]);
            v.add(split[1]);
            System.out.println("pair " + split[0] + ":" + split[1]);
            
            //System.out.println("a");*/
        

【讨论】:

其实我的属性文件有值:a=1,a=2,a=4..........我想得到所有三个键,因为我想比较文件中的每个键与其他键显示文件中存在重复键,无论如何有可能吗? 然后它将 a=1 作为键值对。理想情况下,属性文件不应包含重复项。你还想做吗? 不,我想打印属性文件中多次存在的键 您在上面提供的代码非常有用,即使通过 scan.nextLine() 重复,它也会读取所有值,但在 Split[] 中存储时不会引发任何行发现异常。 您的文件一定有问题。正确终止最后一行。不要在最后一行后按回车键或将文件发送给我,我会检查它。【参考方案2】:

来自 Apache Commons Configuration 的PropertiesConfiguration 支持加载具有相同键的多个条目的属性文件。

使用 getStringArray(key) 方法或 getList(key) 方法访问指定键的所有值。

【讨论】:

更新链接:commons.apache.org/proper/commons-configuration/apidocs/org/…【参考方案3】:

您可以使用缓冲区阅读器读取文件的行并拆分结果:

public static void main(String[] args) throws IOException 
    Reader file = new FileReader("C:/file.cfg");
    BufferedReader br = new BufferedReader(file);

    String line = br.readLine();
    while (line != null) 
        String obj[] = line.split("=");

        for (int i=0 ;  i<obj.length; i=+2  )
            System.out.println(obj[i]+"="+obj[i+1]);

        line = br.readLine();
        
    

【讨论】:

他不是要一段代码,没有任何解释。

以上是关于文件中存在重复键值对时如何读取属性文件?的主要内容,如果未能解决你的问题,请参考以下文章

读取properties文件并获取属性值

属性文件操作之Properties与ResourceBundle

如何在不干扰 iOS 中键值对序列的情况下读写 json 文件?

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。

读取Properties键值对

读取许多json文件以找到公共键值对python