从属性文件读取

从属性文件读取

问题描述:

我有一个属性文件,并尝试读取一些基于条件的值。性能从属性文件读取

内容文件:

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 

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

有人可以帮我吗?

感谢, 维沙尔

+4

问题是它不是一个属性文件。它是一些内容与某个属性文件相匹配的文件。前几行没有。不要使用'Properties'对象来加载文件。阅读我们自己的文章,并自己解析。 – 2014-09-23 06:36:08

+0

我的意见是,有迭代+删除问题,当你删除元素,你也跳过一个...尝试处理从结束或复制到另一个列表... – Betlista 2014-09-23 06:54:14

看这个循环:

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建议,你应该更好的逐行读取文件中的行,分析每个,并在同一时间建立两个列表。

+0

感谢哥们 - A4L。它运作良好。 – Vishal 2014-09-23 07:40:59

+0

感谢M. Deinum的建议。 – Vishal 2014-09-23 07:41:41

+0

@Vishal不客气! – A4L 2014-09-23 07:44:25