Προς το περιεχόμενο

Αποθηκευση/Ανάγνωση Btree σε δισκο(αρχειο)


sabbas_

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας παιδιά έχω το εξής πρόβλιμα,

πρέπει να αποθηκευσω ένα Btree σε ένα αρχείο κ στη συνέχεια να διαβάσω!

Λοιπον έχω φτιάξη το Btree δουλεύει μια χαρα και τορα δυσκυολευομαι!

Αρχικα έχω ενα κόμβο του δένδρου

>public class TNode {

private Item[] element ;//pinakas apo Item
private TNode parent;//deikths pros to patera
public TNode[] sons;//Array apo Kombos TNode
public int nofSons ;//ari8mos tou sunolo ton paidion

και τον επιπλέον κόμβο με τα περισσότερα χαρακρητιστικά

>public class abTNode extends TNode implements Serializable{

int curnofSons;    // trexon plithos gion

public abTNode(Item[] items,abTNode parent , int nofsons){    //constructor
	super(items , parent , nofsons);   // xrisi tou TNode
	
	curnofSons=1; 
	
	}

 

Στη συνέχει το Βδενδρο

>public class abTree extends LinkedGeneralTree{
static RandomAccessFile MyFile; 

       long pos;
/*Μηπως πρέπει να γίνει long[] */ 


       static final int serialized_object_size = 56;
       int a;
int b;
int mycount;

   public abTree(int min , int max){
	setRoot(null);
	setSize(0);
	      //a=b/2
	b = max;
	a = max/2;

}

για την αποθήκευση του δένδρου κ ακολούθος κόμβο κάνω το εξής:

>public void saveBTree(String myfile) throws IOException
  {
      if (Root != null) {
	MyFile = new RandomAccessFile (myfile, "rw");
	pos = 0;
	saveBinNode(Root);
        MyFile.close();
      }
  }

  public long saveBinNode(abTNode rt) throws IOException
  {
      
      long[] child = new long[b]; 
      long node_pos;

      if (rt == null){
        return (long)(-1);}
      else {

	for(int i=0;i<rt.nofSons-1;i++)
    child[i] = saveBinNode((abTNode) rt.sons[i]);
	
               ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
	ObjectOutputStream out = new ObjectOutputStream(bos);
	out.writeObject(rt.element());
	for(int i = 0;i<rt.nofSons-1;i++)
	out.writeLong(child[i]);
	out.close();
	byte[] buf = bos.toByteArray();
        node_pos = pos;
	MyFile.seek(node_pos);
	MyFile.write(buf);
	pos += buf.length;
        return node_pos;
      }
  }

αυτό ότι αφορά την αποθήκευση!Η οποία δίχνει να αποθηκεύει κανονικά!

Κατα την ανάγνωση όμως ποθ την κάνω ώσ εξής:

>public abTree(String myfile)  throws IOException, ClassNotFoundException
  {
      MyFile = new RandomAccessFile (myfile, "r");
      pos = MyFile.length();
      Root = loadBinNode();
      MyFile.close();
  }

  public abTNode loadBinNode() throws IOException, ClassNotFoundException
  {
	  long[] child = new long[b] ;
     

      if (pos == 0)
        return  null;
      else {
        byte[] buf = new byte[serialized_object_size];
        
        pos -= serialized_object_size;
        MyFile.seek(pos);
        MyFile.read(buf);
        ByteArrayInputStream bis = new ByteArrayInputStream(buf);
        ObjectInputStream ois = new ObjectInputStream(bis);
        
        Item[] val = (Item[]) ois.readObject(); 
        TNode rt = new TNode(val);
        System.out.println("Reading: " + rt.element());
        
        child = (long[]) ois.readObject();
        
        for(int u=0;u<child.length;u++)
        if (child[u] == -1)
          rt.setSon(u,(null));
        else
          rt.setSon(u,loadBinNode());
                 return (abTNode) rt;
      }
  
  }

 

κατα την εκτέλεση μου βγάζει το εξής πρόβλιμα:

όταν τα διαβάζει στο σημείο

ByteArrayInputStream bis = new ByteArrayInputStream(buf);

ObjectInputStream ois = new ObjectInputStream(bis);

/*εδο βγάζει το εξής μύνημα

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 00036B65

at java.io.ObjectInputStream.readStreamHeader(Unknown Source)

at java.io.ObjectInputStream.<init>(Unknown Source)

at abTree.loadBinNode(abTree.java:401)*/

εάν κάποιος μπορέι να βοηθίσει!

Ευχαριστώ εκ των προτέρων!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...