Java Serialisierung

vfbf4n1893

Mitglied
Hallo! Ich habe eine generelle Frage zur Serialisierung in Java.

Ich habe eine Hashtable erstellt und diese in eine Datei abgespeichert.
Die Datei wieder einlesen kann ich auch.

Ich habe nun 2 Fragen dazu:

1. Ist es möglich direkt auf die Datei zuzugreifen ohne sie komplett einzulesen? Also z.b. wenn ich darin Hashwerte mit dazugehörigen Passwörtern habe. Kann ich dann direkt erzeugte Hashwerte mit Hashwerten in der serialisierten Datei vergleichen?

2. Wie kann man eine bereits gespeicherte Datei erweitern? Geht das ohne vorheriges Einlesen der Datei?
Also wenn ich sie erweitern wollte, dann müsste ich die Datei einlesen und in einen Hashtable speichern. Danach einfach ein paar neue Werte erzeugen und wieder abspeichern. Auch hier die Frage: Geht das ohne vorheriges Einlesen der Datei?

Wollte das wissen, da das einlesen ja ab einer gewissen Größe auch seine Zeit dauert.
mfg
 
du kannst jederzeit etwas an eine Datei anhängen:
google: text am Dateiende anhängen @ Java - tutorials.de: Tutorial, Forum, Anleitung & Hilfe

Um in einer Datei zu lesen musst du sie einlesen - evtl. als bulk oder zeilenweise

wenn du zeilenweise einliest, kannst du ja jede Zeile prüfen, ob dein Wert schon dabei ist, und darauf reagieren, und das weitere Einlesen abbrechen.

Arbeiten mit Dateien ist allerdings nicht sonderlich performant - man wird es allerdings kaum merken, wenn es sich um wenige Benutzer mit wenigen, kleinen Dateien handelt.

Brauchst du bei einem der Punkte etwas dickeres (mehr Benutzer, mehr Dateien oder größere Dateien), dann wäre es sinnvoll eine Datenbank zu benutzen.
z.b. eine DerbyDB - die kann man sich ins .jar packen, und zur Laufzeit starten - die macht quasi nichts anderes, als auf Dateien rumreiten, kann diese aber besser verwalten
 
Teile einlesen geht mit Serialisierung nicht. Das müsstest du dir selber schreiben. Z.B. so:
Java:
private static byte[] signature = new byte[] { (byte) 'H', (byte) 'a', (byte) 's', (byte) 'h', (byte) 'M', (byte) 'a', (byte) 'p', (byte) 0x00 };

// Ersetz die # sinngemäß
public static void write(HashMap<#, #> t, File f) throw Exception { // Keine Ahnung, welche Exceptions genau.

    FileOutputStream fout = new FileOutputStream(f);
    DataOutputStream dout = new DataOutputStream(fout);

    fout.write(signature);

    Iterator<Map.Entry<#, #>> i = t.iterator();
    while(i.hasNext()) {
        
        Entry<#, #> e = i.next();

        byte[] key = writeObjectToByteArray(e.getKey());
        byte[] value= writeObjectToByteArray(e.getValue());
        dout.writeInt(key.length + value.length); // Für .skip()
        dout.write(key);
        dout.write(value);
    }
}

public static byte[] writeObjectToByteArray(Serializable s) {

    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    ObjectOutputStream oout = new ObjectOutputStream(bout);
    oout.writeObject(s);
    bout.close;
    return bout.toByteArray();
}

public static HashMap<#, #> readEntries(File f, int start, int end) {

    FileInputStream fin = new FileInputStream(f);
    DataInputStream din = new DataInputStream(fin);
    ObjectInputStream oin = new ObjectInputStream(fin);
    
    byte[] sig = new byte[signature.length];
    din.read(sig); // Dateiformat sicher stellen, etc...

    for(int i = 0; i < start; i++)
        din.skip(din.readInt());

    HashMap<#, #> r = new HashMap<#, #>();

    for(int i = 0; i < end - start; i++) {

        din.readInt(); // Länge, uninteressant
        Object key = oout.readObject();
        Object value = oout.readObject();
        r.put(key, value);
    }

    fout.close();

    return r;
}

Das wird sicher so noch nicht funktionieren, ist nur aus dem Kopf aufgeschrieben - Aber vom Ansatz her könnte dir das weiterhelfen.
 
Zuletzt bearbeitet:

Zurück
Oben