2009-08-28 2 views
2

Мне нужно найти строку на определенной строке в текстовом файле, который состоит из нескольких строк строк. Тем не менее, мой цикл для поиска текста или конца файла вечно ищет. Я знаю, что строка находится в файле. Вот код, который я использую, чтобы найти текст - но будьте осторожны, если вы попробуете его в своей системе даже с помощью простого текстового файла, он перейдет в вечный цикл.Java newbie: бесконечный цикл для поиска определенного текста в файле

Я очень ценю любые советы или указатели, чтобы объяснить, что я делаю неправильно здесь.

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"); 
    } 
} 

Update: Нашли проблему - это не найти матч на первой строке файла.

+1

Обратите внимание, что, как правило, более удобным для чтения, чтобы имя булевы после положительного состояния , например boolean found = false; while (! found) –

+4

@elwynn: Нет необходимости удалять ответы на вопросы. Другим людям может помочь в будущем, если у них есть одна и та же проблема и найти это путем поиска SO. –

+0

@elwynn пойти и принять ответ Гэри! – Epaga

ответ

4

Ваш текст, чтобы найти в первой строке, случайно? Вы выполняете операцию readLine за пределами своего цикла, а затем внутри, поэтому первая строка в основном игнорируется.

+0

Хороший и ценный ответ, но как это вызывает бесконечный цикл? – RichieHindle

+0

Большое спасибо Гэри. Да, первая строка файла содержит текст. Я изменил строку String = locateBffer.readLine(); читать строку String = ""; и это решило проблему. – elwynn

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)) { 

В самом деле, если линия имеет нулевое значение, ваш код будет бросать NullPointerException. Вот почему вы должны проверить, line - null.

В дополнение к этому, я полагаю, что вы загляните в commons.lang library of Apache, так как он обеспечивает достаточно ПОЛЕЗНЫЕ классы для текста (как StringUtils) ...

+0

Спасибо за подсказку. Я изменю код соответственно! – elwynn