从属性文件中读取

时间:2014-09-23 06:22:52

标签: java properties-file

我有一个属性文件,并尝试根据条件读取一些值。

属性文件的内容:

    TEST0000000000000000000000000000
    TEST00000000000000000000000000
    TEST000000000000000000000000300
    TEST000000000000000000000000000
    TEST000000000000000000000000000
    TEST000000000000000000050000000
    XXX_LOGIN=//xpath
    XXX_PWD=//xpath

使用以下代码读取属性文件。

public ArrayList<String> getMbunValues() throws IOException {
    Properties p = new Properties();
    ArrayList<String> values = new ArrayList<String>();
        try {
            p.load(new FileInputStream("C:/Testing/Properties.properties"));
        } catch (FileNotFoundException ex) {            
        }

    Enumeration e = p.propertyNames(); 

    for (; e.hasMoreElements();) {
        //System.out.println("size"+e.nextElement());
      //System.out.println(e.nextElement());
      values.add(e.nextElement().toString());
     }

    return values;
  }

}

1.现在我试图在两个单独的函数中获取这些值。一个用于从TEST开始的值。

2.另一个用于XXX_LOGIN等等<​​/ p>

问题:

为了通过TEST获取值,我可以根据以下代码删除XXX_LOGIN值。

public ArrayList<String> useMbunValues() throws IOException {
            ArrayList<String> mbunvaluesList = file.getMbunValues();

            Collections.sort(mbunvaluesList);
            for (int i = 0; i < mbunvaluesList.size(); i++) {
                if ((mbunvaluesList.get(i).contains("_"))) {
                    mbunvaluesList.remove(mbunvaluesList.get(i));
                }
            }

            for (int i = 0; i < mbunvaluesList.size(); i++) {
                System.out.println(mbunvaluesList.get(i));
            }
            return mbunvaluesList;
        }

以上函数返回

TEST0000000000000000000000000000
TEST00000000000000000000000000
TEST000000000000000000000000300
TEST000000000000000000000000000
TEST000000000000000000000000000
TEST000000000000000000050000000

但XXX_LOGIN = // xpath函数也返回TEST值。我使用了以下代码

//Values assigned to array list
public ArrayList<String> useXpathValues() throws IOException {
        ArrayList<String> xpathvaluesList = new ArrayList<String>();
        xpathvaluesList = file.getMbunValues();

//Traversing array list
        for (int i = 0; i < xpathvaluesList.size();) {
            if (!xpathvaluesList.get(i).contains("_")) {
                xpathvaluesList.remove(xpathvaluesList.get(i));
                System.out.println(xpathvaluesList);
                i=i+1;
        }
    }

    for (int i = 0; i < xpathvaluesList.size(); i++) {
        System.out.println(xpathvaluesList.get(i));
    }

    return xpathvaluesList;
}

以上功能的输出如下

TEST0000000000000000000000000000

TEST000000000000000000000000300

XXX_LOGIN

但我只需要带下划线字符的值。

有人可以帮帮我吗?

谢谢, 维沙尔

1 个答案:

答案 0 :(得分:1)

看看这个循环:

for (int i = 0; i < xpathvaluesList.size();) {
    if (!xpathvaluesList.get(i).contains("_")) {
        xpathvaluesList.remove(xpathvaluesList.get(i));
        System.out.println(xpathvaluesList);
        i = i + 1;
    }
}

i什么时候会增加?仅在删除包含下划线的元素之后。否则你将无限循环运行,或者如果所有元素都有下划线,你最终会得到一个空列表。

此外,条件为i < xpathvaluesList.size(),但是当您从列表中删除元素时,大小会发生变化,并且当您删除元素时i增长,这意味着您将永远不会遍历整个列表,因此最终列出了您不需要的列表中的元素。

要解决当前方法的问题,请使用其他列表来保存所需的值。

如果您想使用相同的列表,请使用Iterator及其remove方法。

public ArrayList<String> useXpathValues() throws IOException {
    ArrayList<String> xpathvaluesList = getMbunValues();
    Iterator<String> iterator = xpathvaluesList.iterator();

    while(iterator.hasNext()) {
        String next = iterator.next();
        if (! next.contains("_")) {
            iterator.remove();
        }
    }

    for (int i = 0; i < xpathvaluesList.size(); i++) {
        System.out.println(xpathvaluesList.get(i));
    }
    return xpathvaluesList;
}

打印:

XXX_PWD
XXX_LOGIN

但正如M. Deinum建议的那样,你应该更好地逐行阅读文件,解析每个文件并同时构建两个列表。