2014-09-23 191 views
2

我有一個屬性文件,並嘗試讀取一些基於條件的值。性能從屬性文件讀取

內容文件:

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

回答

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建議,你應該更好的逐行讀取文件中的行,分析每個,並在同一時間建立兩個列表。

+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