Moin
Ich versuche folgendes zu implementieren:
Ich lese den Inhalt 1000er Dateien in meine Objekte ein.
ähmm… Wieviel Speicher verbraucht das und viel lange dauert das einlesen… ? Aber nagut, das ist ein anderes Problem.
Nun, wenn ich ein Objekt manipuliere und in die Datei
zurückschreiben
möchte, will ich prüfen, ob die Datei sich in der zwischenzeit
(viell. von einem anderen
User) geändert hat oder nicht.
Du bekommst ein Locking-Problem. Wenn der andere User auch gerade am Testen ist ob er zurückschreiben soll oder nicht, kann dabei alles mögliche rauskommen. Jenachdem unter welchem OS das ganze läuft kann u.U.
java.nio.FileChannel.lock()
helfen, muss aber nicht.
Somit lese ich meine „aktuelle“
Datei in ein temporäres
Objekt „MyFile“ ein und möchte nun dieses Objekt mit dem
existierenden Objekt aus meinem
Speicher inhaltlich auf Gleichheit prüfen.
D.h. die Properties sollen „gleich“ sein. Kein Problem:
public void equals (Object O){
try {
if (!((MyFile)O).Id.equals(id)){
return false;
}
Properties orginal = p;
Properties copy = ((MyFile)O).p;
if (orginal.size() == copy.size()){
Enumeration E = orginal.keys();
while (E.hasMoreElements()){
Object key = E.nextElement();
Object O = orginal.get(key);
Object O2 = copy.get(key);
if (!O.equals(O2)){
return false;
}
}
return true;
} else {
return false;
}
} catch (Exception E){
retrun false;
}
}
An sich kann auch Properties.equals helfen:
Compares the specified object with this map for equality. Returns true if the given object is also a map and the two Maps represent the same mappings. More formally, two maps t1 and t2 represent the same mappings if t1.entrySet().equals(t2.entrySet()). This ensures that the equals method works properly across different implementations of the Map interface.
Allerdings bin ich mir da nicht ganz sicher.
hier geht es um inhaltliche Gleichheit. das bedeutet ist der
Inhalt MyObjekt.p == der Inhalt tmpFile.p? usw.
„falsch“. Inhaltliche Gleichheit wird unter java immer mit .equals() bestimmt. Wenn du da irgendwo „==“ schreibst wird das nix.
else ( System.out.println(„Datei wurde verändert. Bitte Datei
neu laden und dann die Änderungen vornehmen“)
Wozu ? Du kanns dir ja merken was vom User geändert wurde und dann selektiv nur die Daten überschrieben.
cu