2014-02-13 2 views
0

Я пытаюсь сравнить два .txt-файла (то есть их содержимое), но когда я выполняю этот код, мое приложение переходит в бесконечный цикл. Зачем?Сравнение двух файлов в java

public int compareFile(String fILE_ONE2, String fILE_TWO2)throws Exception 
{ 

File f1 = new File(fILE_ONE2); //OUTFILE 
File f2 = new File(fILE_TWO2); //INPUT 

FileReader fR1 = new FileReader(f1); 
FileReader fR2 = new FileReader(f2); 

BufferedReader reader1 = new BufferedReader(fR1); 
BufferedReader reader2 = new BufferedReader(fR2); 

String line1 = null; 
String line2 = null; 
int flag=1; 
while ((flag==1) &&((line1 = reader1.readLine()) != null)&&((line2 = reader2.readLine()) != null)) 
{ 
    if (!line1.equalsIgnoreCase(line2)) 
     flag=0; 
    else 
     flag=1; 
} 
reader1.close(); 
reader2.close(); 
return flag; 


} 
+1

Вставьте Println операторы внутри вашего цикла и посмотреть, что он делает. –

+0

Вы должны сломаться; в то время как цикл, когда вы достигнете первой ничьей, или получите результат сравнения последней строки. –

+0

Я не думаю, что в коде существует бесконечный цикл. – Kick

ответ

0

Код выглядит хорошо, без бесконечных циклов. Вы можете удалить независимо проверить в коде и может обновить код, как показано ниже:

int flag=1; 
while (((line1 = reader1.readLine()) != null)&&((line2 = reader2.readLine()) != null)) 
{ 
    if (!line1.equalsIgnoreCase(line2)) 
    { 
     flag=0; 
     break; 
    } 
} 

Как тип возвращаемого значения метода является целым числом, чем он будет возвращать 0 если разные и 1 если они равны.

1

Я преобразовал ваш код в основную программу. В этом коде нет бесконечного цикла.

Я предполагаю, что вы сравниваете 2 текстовых файла небольшого размера.

import java.io.*; 

public class Diff { 
    public static void main(String[] args) throws FileNotFoundException, IOException { 

     File f1 = new File(args[0]);// OUTFILE 
     File f2 = new File(args[1]);// INPUT 

     FileReader fR1 = new FileReader(f1); 
     FileReader fR2 = new FileReader(f2); 

     BufferedReader reader1 = new BufferedReader(fR1); 
     BufferedReader reader2 = new BufferedReader(fR2); 

     String line1 = null; 
     String line2 = null; 
     int flag = 1; 
     while ((flag == 1) && ((line1 = reader1.readLine()) != null) 
       && ((line2 = reader2.readLine()) != null)) { 
      if (!line1.equalsIgnoreCase(line2)) 
       flag = 0; 
     } 
     reader1.close(); 
     reader2.close(); 
     System.out.println("Flag " + flag); 
    } 
} 

Я запустил его на двух небольших текстовых файлах. Это результат.

javac Diff.java && java Diff a.txt b.txt 
Flag 0 

Если вы считаете, что у вас бесконечный цикл, проблема может быть в другом месте.

+0

@rick, почему вы думаете, что у вас бесконечный цикл? Возможно, проблема в другом месте? Вы можете использовать ту же стратегию здесь, чтобы протестировать бит кода в приложении основной линии Java. (JUnit/TestNG лучше, но это тоже будет работать). – Jess

+0

Это должен быть комментарий, а не ответ. –

+0

Привет @JohnKugelman, я действительно потратил некоторое время на тестирование с разными файлами. Кроме того, ОП хотел знать, почему был бесконечный цикл, и я думаю, что я ответил на вопрос. Я также представил стратегию для OP, чтобы проверить код, выполнив его следующим образом. – Jess

0

Предполагая, что входы текстовых файлов, альтернативная реализация в контур while:

while (true) // Continue while there are equal lines 
{ 
    line1 = reader1.readLine(); 
    line2 = reader2.readLine(); 

    if (line1 == null) // End of file 1 
    { 
     return (line2 == null ? 1 : 0); // Equal only if file 2 also ended 
    } 
    else if (line2 == null) 
    { 
     return 0; // File 2 ended before file 1, so not equal 
    } 
    else if (!line1.equalsIgnoreCase(line2)) // Non-null and different lines 
    { 
     return 0; 
    } 

    // Non-null and equal lines, continue until the input is exhausted 
} 

Первый else if не является необходимым, но она включена в целях ясности. В противном случае, приведенный выше код может быть упрощено до:

while (true) // Continue while there are equal lines 
{ 
    line1 = reader1.readLine(); 
    line2 = reader2.readLine(); 

    if (line1 == null) // End of file 1 
    { 
     return (line2 == null ? 1 : 0); // Equal only if file 2 also ended 
    } 

    if (!line1.equalsIgnoreCase(line2)) // Different lines, or end of file 2 
    { 
     return 0; 
    } 
} 

Цикл должен быть помещен в try/finally блока, чтобы гарантировать, что читатели закрыты.

0

Выше метод Джесс потерпит неудачу, если файл2 такой же, как файл1, но имеет дополнительную строку в конце.

Это должно сработать.

public boolean compareTwoFiles(String file1Path, String file2Path) 
      throws IOException { 

    File file1 = new File(file1Path); 
    File file2 = new File(file2Path); 

    BufferedReader br1 = new BufferedReader(new FileReader(file1)); 
    BufferedReader br2 = new BufferedReader(new FileReader(file2)); 

    String thisLine = null; 
    String thatLine = null; 

    List<String> list1 = new ArrayList<String>(); 
    List<String> list2 = new ArrayList<String>(); 

    while ((thisLine = br1.readLine()) != null) { 
     list1.add(thisLine); 
    } 
    while ((thatLine = br2.readLine()) != null) { 
     list2.add(thatLine); 
    } 

    br1.close(); 
    br2.close(); 

    return list1.equals(list2); 
} 
-2

если вы используете java8, приведенный ниже код для сравнения содержимого файла

public boolean compareTwoFiles(String file1Path, String file2Path){ 
     Path p1 = Paths.get(file1Path); 
     Path p1 = Paths.get(file1Path); 

try{ 
     List<String> listF1 = Files.readAllLines(p1); 
    List<String> listF2 = Files.readAllLines(p2); 
    return listF1.containsAll(listF2); 

     }catch(IOException ie) { 
      ie.getMessage(); 
     } 

    } 
+0

Это невероятно неэффективно - читает все файлы в памяти. Кроме того, неверно - containsAll() не проверяет, является ли порядок одинаковым. –

Смежные вопросы