Kleiner Texteditor mit MD5-Check

Spitfire777

Bekanntes Mitglied
Hi,

ich habe vor, mir einen kleinen Texteditor zu basteln. In diesen moechte ich das Feature einbauen, dass bei bei geaendertem Text der Speichern-Button aktiv wird und wenn der Text gespeichert wurde/der Inhalt nicht veraendert wurde, der Button inaktiv wird.

Da es ja aus Performance-Gruenden Quatsch ist, den kompletten Text zwischenzuspeichern und ihn bei jedem Tastendruck mit der jetzigen Version zu vergleichen, will ich das ganze mit MD5-Hashs loesen.
Bei jedem Tastendruck soll der Anfangshash mit dem aktuellen Hash verglichen werden.

Leider geht das ganze programmiertechnisch nicht so fix wie z.B. in PHP ( md5("abc") ), also hab ich mir folgendes zusammengebastelt:

So bekomme ich einen MD5-Hash:
Java:
    /**
     * Returns a string MD5-Hash for a given string
     */
    public String getMD5ForString(String string) {

        try {
            MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
            digest.update(string.getBytes());
            byte[] hash = digest.digest();

            StringBuffer hexString = new StringBuffer();

            for (int i = 0; i < hash.length; i++) {
                hexString.append(Integer.toHexString(0xFF & hash[i]));
            }
            
            return hexString.toString();
        }
        catch (NoSuchAlgorithmException e) {
            System.err.println(e);
            System.exit(0);
            return null;
        }
    }

So wird der MD5-Wert des Ursprungsinhaltes geholt:
Java:
    public void loadFile(String path) throws FileNotFoundException, IOException {
        file = new File(path);

        if (!file.exists() || !file.isFile()) throw new FileNotFoundException();

        fileReader = new FileReader(file);
        bufferedReader = new BufferedReader(fileReader);

        String line = bufferedReader.readLine();
        tfContent.append(line);

        while (line != null) {
            tfContent.append("\n" + line);
            line = bufferedReader.readLine();
        }

        fileContentHash = getMD5ForString(tfContent.getText());

        bufferedReader.close();
    }


So ueberpruefe ich, ob der Anfangs-MD5-Wert derselbe wie der jetzige ist.
tfContent ist ein JTextArea

Java:
    public boolean contentChanged() {
        if (fileContentHash.equals(getMD5ForString(tfContent.getText())))
            return true;
        else
            return false;
    }

Und schlussendlich in ein Key-Typed-Event eingebunden:
Java:
    private void tfContentKeyTyped(java.awt.event.KeyEvent evt) {                                   
        if (contentChanged())
            btSave.setEnabled(true);
        else 
            btSave.setEnabled(false);
    }

Jetzt ist halt das Problem, dass das ganze nicht funktioniert. Mal aktiviert er den Button, mal nicht. Hat auf jeden Fall was mit den Hashwerten zutun!
 

madboy

Top Contributor
Ohne eine Lösung für dein Problem zu haben:

Warum machst du das nicht ganz einfach und setzt ein Flag wenn der Benutzer was ändert?
Code:
boolean userHasChangedText
Alternativ kannst du den Button auch gleich aktivieren/deaktivieren, statt ein Flag zu setzen. Dann hast du keine Probleme mit Hashes und musst auch keinen Text vergleichen.
 

Spitfire777

Bekanntes Mitglied
hi,

schon richtig, aber ich wills so haben, dass wenn der text wieder im ursprungszustand ist, der speicherbutton wieder inaktiv wird.
mit deiner methode wuerde der speicherbutton wieder aktiv bleiben, wenn ich an den text ein zeichen anhaengen wuerde und es wieder wegnehmen wuerde.
 

madboy

Top Contributor
Ok, das stimmt. Du schreibst, dass es manchmal funktioniert, manchmal aber nicht. Stimmen denn die Hashes? Prüfe auch mal, was zum Zeitpunkt der Hashberechnung in der JTextArea steht (getText() ). Könnte sein, dass getText() bei keyTyped() noch nicht immer den ganzen geänderten Text liefert. Zum Beispiel bei DEL, BACKSPACE oder anderen Tasten.
 

Der Müde Joe

Top Contributor
Deine MD5 Methode liefert falsche Werte. Die for-Schleife liefert bei Werten kleiner als 16 falsche Werte. Sprich wenn zb 0x0F da ist kommt F anstatt 0F in deinen MD5 (Kann man zB mit "hallo" testen".

Entwerder du benutzt sowas wie org.apache.commons.codec.binary.Hex oder addedst ein 0 wenn <16 oder benutzt sowas:
Java:
private static char[] CHARS = "0123456789abcdef".toCharArray();

public static String getHex(byte b) {
    char[] result = new char[2];
    result[0] = CHARS[(b & 0xF0) >>> 4];
    result[1] = CHARS[(b & 0x0F)];
	return String.valueOf(result);
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Kleiner Downloader Allgemeine Java-Themen 3
vandread Problem bei kleiner Thread-Übung Allgemeine Java-Themen 2
H Kleiner HTML Parser (Facharbeit) Allgemeine Java-Themen 11
Landei Kleiner UPN-Rechner für BigIntegers Allgemeine Java-Themen 5
-MacNuke- [NumberFormat] Prozente kleiner 1% Allgemeine Java-Themen 11
chik Doppelt verkettete Liste bzw. Zirkulärliste (kleiner Fehler, den ich nicht finde) Allgemeine Java-Themen 4
G JRE: Minimale Systemanforderungen kleiner als 64 MB? Allgemeine Java-Themen 6
M Texteditor gesucht Allgemeine Java-Themen 3
G Java Texteditor Allgemeine Java-Themen 3
M Java Texteditor? Allgemeine Java-Themen 3
Robert Zenz Ich brauche bitte mal kurz einen Sanity/Reality-Check betreffend Tests. Allgemeine Java-Themen 9
N MsgPack - Null Check Allgemeine Java-Themen 5
Ananaskirsche Website mit Browser-Check aufrufen Allgemeine Java-Themen 8
perlenfischer1984 Wann ist ein Parameter Check sinnvoll Allgemeine Java-Themen 7
P business check Allgemeine Java-Themen 2
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
1 Check read/write permission for file Allgemeine Java-Themen 4
L Java Performance Check Tool Allgemeine Java-Themen 3
W 8 Bit CRC-Check (Umsetzung C->Java) Allgemeine Java-Themen 3
S HILFE! UML-Moddelierung. Ich check es nit! Allgemeine Java-Themen 4
S versions-check Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben