# Dateien binär vergleichen



## jensa (7. Nov 2007)

Hallo, ich wollte jetzt zwei dateien einlesen und diese dann im inhalt vergleichen nun meinte jemand zu mir löse es sdoch auf binärer ebene, problem ist ich habe keine ahnung iwe ich es lösen könnte, habt ihr evtl tipps wie ich das lösen kann?
gibt es eine java-klasse ? 
hat einer einen codesnipplet?

wäre echt dankbar euch.


mfg jensa


----------



## Wildcard (7. Nov 2007)

Wozu soll der diff dienen? Als Visualisierung? Um eine Datei zu aktualisieren?
Um welche Art von Daten handelt es sich dabei?


----------



## Saxony (7. Nov 2007)

Hiho,

kommt darauf an wie detailliert du die Unterschiede rausfinden möchtest.
Reicht dir ein einfaches die sind nicht identisch oder muss es so ausführlich wie bei einem Merge-Tool sein?

Zusätzlich ist noch interessant um was für Dateien es sich handelt - Binärdaten, Textfiles... - weil Textfiles würde ich schon mal nicht auf Byteebene vergleichen.

Ansonsten bleibt dir halt nix anderes übrig und du musst Byte für Byte der einen mit Byte für Byte der andren vergleichen.
Schau dir dazu mal FileInputStream an.

Mann kann auch vorher schon gewisse Prüfungen vornehmen um besondere Auffälligkeiten sofort auszuschließen.
Zum Beispiel unterschiedliche Dateigröße, Erstellt am unterschiedlich usw..

bye Saxony


----------



## jensa (7. Nov 2007)

hallo es handelt sich um sowohl als auch.
es handelt sich um pdfs & textdateien.

ich will verhindern das z.b. zweimal das selbe hochgeladen wird zur weiterverarbeitung.

wie könnte ich die informationen über eine datei ggf erfragen wobei ich glaube das es damit nicht lösbar sein wird da eine datei auf dem server dann ein anderesformat hat und textdateien schreibe ich selbst dort hat ein benutzer nur bei meiner jsp anwendung die möglichkeit diese in einen input-text einzufügen und ich schreibe diese datei dann live auf dem server.


----------



## Niki (7. Nov 2007)

Ich würds so machen

```
public static boolean compareFileContent(File f1, File f2) throws IOException{
		if(f1.length() != f2.length())
			return false;
		FileInputStream fis1 = null;
		FileInputStream fis2 = null;
		try{
			fis1 = new FileInputStream(f1);
			fis2 = new FileInputStream(f2);
			int byte1 = 0;
			int byte2 = 0;
			while((byte1 = fis1.read()) != -1 && (byte2 = fis2.read()) != -1){
				if(byte1 != byte2)
					return false;
			}
			
			
		}finally{
			if(fis1 != null)
				fis1.close();
			if(fis2 != null)
				fis2.close();
		}
		return true;
	}
```


----------



## Wildcard (7. Nov 2007)

jensa hat gesagt.:
			
		

> ich will verhindern das z.b. zweimal das selbe hochgeladen wird zur weiterverarbeitung.


Dann vergleich den Hash der Datei. Alles andere ist doch Unfug, weil du immer noch die gesamte Datei hochladen müsstest.


----------



## jensa (7. Nov 2007)

das hört sich gut an werd mir das mal anschauen und schauen
danke erstmal

@saxony:
deine dateinformationen würde mich generell mal interessieren


//edit:
und wie kann ich es hash-mäßig vergleichen weil wenn ein benutzer nur einen text-area befüllt existierit doch noch kein hashwert von der datei oder soll ich den string mit dem anderen hash -vergleichen?


----------



## Saxony (7. Nov 2007)

jensa hat gesagt.:
			
		

> @saxony:
> deine dateinformationen würde mich generell mal interessieren



Nunja die stecken so gut wie alle in der Klasse File drinne.

File#length()
File#lastModified()

usw.

Um das Hochladen der Datei wirst du nicht drum rum kommen wenn du nur den Namen hast. Es sei denn du hast eindeutige Namen und ein File welches vom Namen her schon auf dem Server existiert braucht gar nicht erst wieder hochgeladen werden.

Ansonsten kommt man an Dinge wie Hash, Größe usw. nur mit einer verfügbaren Kopie der Datei heran.

bye Saxony


----------



## Wildcard (7. Nov 2007)

jensa hat gesagt.:
			
		

> und wie kann ich es hash-mäßig vergleichen weil wenn ein benutzer nur einen text-area befüllt existierit doch noch kein hashwert von der datei oder soll ich den string mit dem anderen hash -vergleichen?


Ach so, verstehe, da ist kein Client involviert der einen Hash ziehen könnte...
Ja, dann geht das so nicht.


----------

