从属性文件读取
问题描述:
我有一个属性文件,并尝试读取一些基于条件的值。性能从属性文件读取
内容文件:
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等
问题:
为了得到与测试我能砸在下面的代码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的函数返回的测试数值为好。我用下面的代码
//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
但我只需要带下划线的值。
有人可以帮我吗?
感谢, 维沙尔
答
看这个循环:
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建议,你应该更好的逐行读取文件中的行,分析每个,并在同一时间建立两个列表。
问题是它不是一个属性文件。它是一些内容与某个属性文件相匹配的文件。前几行没有。不要使用'Properties'对象来加载文件。阅读我们自己的文章,并自己解析。 – 2014-09-23 06:36:08
我的意见是,有迭代+删除问题,当你删除元素,你也跳过一个...尝试处理从结束或复制到另一个列表... – Betlista 2014-09-23 06:54:14