JTree speichern und wieder einlesen

grafsoft

Mitglied
Hallo,

ich möchte den vom Anwendet bearbeiteten jTree beim Schließen der Form speichern, in einer MySQL-Datenbank als BLOB abspeichern und beim neuerlichen Öffnen wieder einlesen.

Mein Fehler dürfte wohl hier liegen, beim Einlesen:

tree = (JTree) in.readObject();
...

treemodel = (DefaultTreeModel) in.readObject();
treemodel.reload();
tree.setModel(treemodel);

Was mache ich falsch?

Java:
    private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
        System.out.println ("Closing");
        DefaultTreeModel treemodel = (DefaultTreeModel) tree.getModel();
        try {
            FileOutputStream file = new FileOutputStream("tree.txt");
            ObjectOutputStream out = new ObjectOutputStream(file);
            out.writeObject(tree);
            file = new FileOutputStream("model.txt");
            out = new ObjectOutputStream(file);
            out.writeObject(treemodel);
            
            MySQLConn conn = new MySQLConn();
            String asql = "update blobs set ablob=? where akey=1";
            File fil = new File("tree.txt");
            FileInputStream fis = new FileInputStream(fil);
            PreparedStatement pstmt = conn.getconn().prepareStatement(asql);
            pstmt.setBinaryStream(1, fis, (int) fil.length());
            pstmt.executeUpdate();
            asql = "update blobs set ablob=? where akey=2";
            fil = new File("model.txt");
            fis = new FileInputStream(fil);
            pstmt = conn.getconn().prepareStatement(asql);
            pstmt.setBinaryStream(1, fis, (int) fil.length());
            pstmt.executeUpdate();
            
            
        } catch (Exception e) {
            e.printStackTrace();
                    
        }
    } 

 void loadtree() {
        MySQLConn conn = new MySQLConn();
        DefaultTreeModel treemodel = (DefaultTreeModel) tree.getModel();
        try {
            String asql = "SELECT LENGTH(ablob) FROM blobs where akey=1";
            int i = Integer.parseInt(conn.singleresult(asql));
            if (i > 40) {
                asql = "select ablob from blobs where akey=1";
                ResultSet rs = conn.getstat().executeQuery(asql);
                rs.next();
                File fil = new File("tree.txt");
                FileOutputStream output = new FileOutputStream(fil);
                InputStream input = rs.getBinaryStream("ablob");
                byte[] buffer = new byte[1024];
                while (input.read(buffer) > 0) {
                    output.write(buffer);
                }
                FileInputStream file= new FileInputStream("tree.txt");
                ObjectInputStream in = new ObjectInputStream(file);
                tree = (JTree) in.readObject();
                asql = "select ablob from blobs where akey=2";
                rs = conn.getstat().executeQuery(asql);
                rs.next();
                fil = new File("model.txt");
                output = new FileOutputStream(fil);
                input = rs.getBinaryStream("ablob");
                while (input.read(buffer) > 0) {
                    output.write(buffer);
                }
                file = new FileInputStream("model.txt");
                in = new ObjectInputStream(file);
                treemodel = (DefaultTreeModel) in.readObject();
                treemodel.reload();
                tree.setModel(treemodel);
                
            }
        } catch (Exception e2) {
            e2.printStackTrace();
        }
        
    }
 
Du solltest den Code besser strukturieren und dich informieren wie man Datenbanken per JDBC verwendet. Der gezeigte Code setzt das sehr schlecht um.
 
Bist du dir sicher das du deinen tree Objekt in der Datei speicherst?

In Zeile 7 erstellst du einen neuen stream mit auf die variable out.
Das sollte ein andrer Bezeichner sein.

Schließen sollte man die Streams auch am Ende.
 
Was mache ich falsch?
Der erste Fehler ist, dass Du uns nicht genau sagst, was Du für einen Fehler bekommst.

Dann öffnest Du eine Datei zum schreiben und versuchst diese Datei zu laden, ohne sie vorher zu schließen. Das könnte zu Problemen führen je nach Betriebssystem. Hier der klare Hinweis auf try-with-resources!

Dann musst Du natürlich Daten nicht in eine Datei schreiben. Du liest die Daten aus dem Blob in ein byte Array und kannst darauf dann ein Stream öffnen (ByteArrayInputStream).

Dann solltest Du ganz dringend UI vom Model trennen. Man speichert in der Regel keine UI (JTree) sondern lediglich die dargestellten Daten!
 
Der erste Fehler ist, dass Du uns nicht genau sagst, was Du für einen Fehler bekommst.

Dann öffnest Du eine Datei zum schreiben und versuchst diese Datei zu laden, ohne sie vorher zu schließen. Das könnte zu Problemen führen je nach Betriebssystem. Hier der klare Hinweis auf try-with-resources!

Dann musst Du natürlich Daten nicht in eine Datei schreiben. Du liest die Daten aus dem Blob in ein byte Array und kannst darauf dann ein Stream öffnen (ByteArrayInputStream).

Dann solltest Du ganz dringend UI vom Model trennen. Man speichert in der Regel keine UI (JTree) sondern lediglich die dargestellten Daten!
Jetzt funktionierts! Die Datei nicht zu schließen war natürlich dümmlich. Danke für den Hinweis!

Das Model alleine zu speichern reicht, danke!

Das Datei schreiben war nur für die Kontrolle. Jetzt versuche ich es direkt.
 

Zurück
Oben