Diff w Javie?

0

Witam.

Jak zrobic program porównujący 2 pliki i wyświetlający rożnice między nimi? Cos w podobie linuxowego diff. Dopiero co zaczynam pisac cos w javie.
Znalazłem w sieci:
java-diff http://www.incava.org/projects/java-diff/
Diff.java http://www.darwinsys.com/freeware/Diff.java :/
ale nie za bardzo to kumam. Chodzi mi o cos prostszego! :) (porownanie wierszy i wyswietlenie rozniacych sie od siebie). Costam już probowalem ale nic z tego nie wyszło.;P

Z góry dzięki za wszelką pomoc.

0

Jeśli chcesz wyświetlić jedynie wiersze różniące to algorytm jest prosty:

  • otwórz 1 plik
  • otwórz 2 plik
  • wykonaj pętle dopóki nie koniec obu plików (
  • przeczytaj linie z 1 pliku
  • przeczytaj linie z 2 pliku
  • prównaj i wyświetl jeśli są różne )
  • zamknij oba pliki

Napisz co udało Ci się zrobić.

0

Dzieki.
na razie wymodzilem cos takiego - wiem ze to jest zle ale nie wiem dlaczego ;)

import java.io.*;

public class MojeWypociny
 {
    public static void main (String args[]) throws IOException
      {
        String plik1 = new String();
          for (int i=0; i < args.length; i++)
            try
              {
                BufferedReader bufor1 = new BufferedReader (new FileReader(args[i]));
              }
            catch (FileNotFoundException exc)
              { System.out.println("Nie Podales Nazwy 1 Pliku"); return; }
        String plik2 = new String();
          for (int j=0; j < args.length; j++)
            try
              {
                BufferedReader bufor2 = new BufferedReader (new FileReader(args[j]));
              }
            catch (FileNotFoundException exc)
              { System.out.println("Nie Podales Nazwy 2 Pliku"); return; }
          if (plik1.equals(plik2))           
              { System.out.println("Pliki Takie Same"); }        
          else
            { System.out.println("Pliki Roznia sie"); }
      }
  }

Nie wiem czemu jak laduje dwa rozne pliki program wyswietla mi ze sa takie same :)

Chcialbym zeby bylo wyswietlane cos takiego gdy pliki sie roznia: Nie wiem wlasnie jak zrobic zeby wyswietlalo linie ktore sie roznia.

{ System.out.println("Pliki Roznia sie");
   System.out.println("<<<" odczytPierwszegoBufora.getLineNumber() + ": " + 1string);  
   System.out.println("-----");
   System.out.println(">>>" odczytDrugiegoBufora.getLineNumber() + ": " + 2string);
}

Prosze nie bijcie wiem ze na pewno tu jest full bledow! Nie mam jeszcze dobrej ksiazki Ale niedlugo kupie - oiecuje! :)

0

Przeanalizujmy co wykonuje ten kod:

for (int i=0; i < args.length; i++)
try
{
    BufferedReader bufor1 = new BufferedReader (new FileReader(args[i]));
}
catch (FileNotFoundException exc)
{ System.out.println("Nie Podales Nazwy 1 Pliku"); return; }

Odpowiedź jest prosta: wykonuje pętlę po wszystkich argumentach z jakimi został uruchomiony program. Po zakończeniu pętli bufor1 będzie wskazywał plik podany w ostatnim argumencie. To samo tyczy się następnej pętli. Dlatego właśnie wynik działamnia programu jest: "plki są takie same"

Prawidłowo powinno być:

try
{
    BufferedReader bufor1 = new BufferedReader (new FileReader(args[0]));
}
catch (FileNotFoundException exc)
{ System.out.println("Nie Podales Nazwy 1 Pliku"); return; }

try
{
    BufferedReader bufor2 = new BufferedReader (new FileReader(args[1]));
}
catch (FileNotFoundException exc)
{ System.out.println("Nie Podales Nazwy 2 Pliku"); return; }

Aby wykoknać sprawdzenie poszczególnych wierszy musisz odwołać się do obu buforów wg poprzednich wskazówek.

0

Dzieki za pomoc. Zmienilem kod troche. Czy to powinno mniej wiecej tak wygladac?

import java.io.*;

class NowyPorownywacz2 
  {
    public static void main(String args[]) throws IOException
      {           
            try
              {
               BufferedReader bufor1 = new BufferedReader (new FileReader(args[0]));
              }
            catch (FileNotFoundException exc)
              { System.out.println("Nie Podales Nazwy 1 Pliku"); return; }
            try
              {
               BufferedReader bufor2 = new BufferedReader (new FileReader(args[1]));
              }
            catch (FileNotFoundException exc)
              { System.out.println("Nie Podales Nazwy 2 Pliku"); return; }

            String plik1, odczyt1 = new String();
            String plik2, odczyt2 = new String();

            while((plik1 = bufor1.readLine()) != null)
              odczyt1 += plik1 = "\n";
            while((plik2 = bufor2.readLine()) != null) 
              odczyt2 += plik2 = "\n";                  

            if (plik1.equals(plik2))           
              { System.out.println("Pliki Takie Same"); }        
            else
              { System.out.println("Pliki Roznia sie"); }                             
      }
  }  

A teraz mam blad:

non-static variable bufor1 cannot be referenced from a static context
while((plik1 = bufor1.readLine()) != null)

Czy chodzi o to ze bufor1 jest nie statyczny a plik1 tak?
Jak dostac sie do tych linii tak zeby mozna je bylo sprawdzic?

Pozdrawiam

0

Oba BufferedReader'y musisz zadeklarować przed blokiem try. Aby porównać linię zrób tak:

String plik1, linia1;
String plik2, linia2;
plik1 = "";
plik2 = "";
int numerLinii = 0;
while (((linia1 = bufor1.readLine()) != null) && ((linia2 = bufor2.readLine()) != null)){
plik1 += linia1 + "\n"; //zapisujemy całą zawartość pliku
plik2 += linia2 + "\n";
if (!linia1.equals(linia2))
   System.out.println("Linie " + numerLinii + " są różne");
numerLinii++;
}

Po wykonaniu tego kodu zmienne plik1 i plik2 reprezentują całą zawartość plików.

P.S. W swoim rozwiązaniu nie uwzględniłeś moich wskazówek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1