2009-08-28 31 views
2

我需要在由幾行字符串組成的文本文件中的特定行上找到一個字符串。但是,我的循環找到文本或文件的結尾是永遠搜索。我知道字符串在文件中。這裏是我用來定位文本的代碼 - 但要注意的是,如果您在系統上嘗試使用它,即使使用簡單的文本文件,它也會進入永久循環。Java新手:無限循環搜索文件中的特定文本

我非常感謝任何提示或指示,以解釋我在這裏做錯了什麼。

private static void locateText(String locateText, BufferedReader locateBffer) { 
    boolean unfound = true; 
    try 
    { 
     String line = locateBffer.readLine(); 
     while (unfound) 
     { 
      line = locateBffer.readLine(); 
      if ((line.equals(locateText)) || (line == null)) 
      { 
       unfound = false; 
      } 
     } 
    } 
    catch(IOException e) 
    { 
     System.out.println("I/O error in locateText"); 
    } 
} 

更新:發現了問題 - 這是沒有找到該文件的第一行的比賽。

+1

注意,它通常是更具可讀性的名字布爾積極條件之後,例如boolean found = false; while(!found) – 2009-08-28 12:22:56

+4

@elwynn:沒有必要刪除回答的問題。如果他們遇到同樣的問題,可能會在未來幫助其他人,並通過搜索找到它。 – 2009-08-28 12:49:54

+0

@elwynn繼續並接受加里的回答! – Epaga 2009-08-28 13:11:43

回答

4

您的文字是否可以在第一行找到?你在你的循環之外進行readLine操作,然後在裏面,所以第一行基本上被忽略。

+0

一個好的和有價值的答案,但是如何造成無限循環? – RichieHindle 2009-08-28 12:52:26

+0

非常感謝加里。是的,文件的第一行包含文本。我改變了String line = locateBffer.readLine();讀取String line =「」;並解決了這個問題。 – elwynn 2009-08-28 13:17:08

0

改變這種循環,類似的東西,它會讀取所有行:

while((line = locateBffer.readLine()) != null){ 
if(line.equals(locateText)){ 
    break; 
} 
} 

也許這將有所幫助。

5

我認爲GaryF是正確的(您的文本位於文件的第一行)。

我想在你的代碼來點線:

if ((line.equals(locateText)) || (line == null)) { 

而是必須這樣寫:

if ((line == null) || (line.equals(locateText)) { 

事實上,如果線爲null,您的代碼將拋出一個NullPointerException。這就是爲什麼你必須測試line之前是否爲null

除此之外,我建議你在commons.lang library of Apache看看,因爲它提供了非常有用的類文本(如StringUtils的)...

+0

謝謝你的提示。我會相應地修改代碼! – elwynn 2009-08-28 13:17:59