Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dodavanje serijalizovanih objekata u fajl ???

[es] :: Java :: Dodavanje serijalizovanih objekata u fajl ???

[ Pregleda: 389 | Odgovora: 3 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

boris Dj.bl
Banjaluka

Član broj: 167469
Poruke: 64
79.143.164.*



Profil

icon Dodavanje serijalizovanih objekata u fajl ???19.07.2008. u 13:20

Naslov sam kaze o cemu se radi a pri tom se javlja jedan problem

Neka imamo klasu Auto

Code:

public class Auto  implements java.io.Serializable {

        private boolean upaljen;
    

    public Auto() {  upaljen = false;  }

    public void upali () {  upaljen = true;  }

    public void ugasi () {  upaljen = false; }
    
        public boolean radi () { return upaljen;  }
    
}


E sad ja hocu da objekate ove klase upisujem u fajl al tako da se ne brisu prethodni objekti.

Ispod je mali program koji to simulira.

Naime prvo se ocitavaju objekti iz fajla.
Moze maks da se ocita 5 objekata a ako ima manje, npr u jednom trenutku nek ih je dva, on ce ih ucitati i tad ce izbaciti Exception koji nista ne radi vec se program tad dalje nastavlja.
Bukvalno koristim Exception za prekid while petlje. Ovo mozda nije najidealnije al to sad nije bitno. Inace mogao bih u dodatnom fajlu drzati int koji bi predstavljao broj objekata. Al kao sto sam rekao to sad nije bitno.

Nakon ocitavanja se ispise broj tih objekata.
I onda se upise jos jedan objekat.

U praksi to radi tako sto posto prvo nema fajla on se stvori, i upise se jedan objekat.
Zatvorim program pa ga ponovo pokrenem sad se ocita onaj prvi objekat, ispise se i upise se jos jedan.
( S tim da taj ispis nije pravi ispis objekata, za to bi morao definisati metodu toString(), vec ako su npr 2 objekta samo ispise a[0] a[1].
Ovo koristim samo da znam koliko je ucitano objekata. )
Opet zatvorim program i pokrenem ga ponovo i tad se ispise samo jedan objekat.
E to je problem jer bi trebalo dva.
I svako naredno pokretanje programa ocitava i ispisuje samo onaj prvi objekat.

Ipak fajl se uvijek povecava sto znaci da se objekti zaista upisuju al je problem pri ocitavanju.

Ja sam pretpostavio sta bi mogao biti problem.
Sumnjam da se pri upisu prvog objekta stavi neki znak koji oznacava kraj fajla.
I kad se upise drugi objekat on se zaista upise al u nastavku a onaj znak ostane.
Sad se pri ocitavanju ocita prvi objekat naidje sa na znak za kraj fajla i on prekine ne znajuci da poslije ima jos objekata.
Al ovo je samo moja pretpostavka.

Uglavnom zna li neko kako da proradi ovo dodavanje objekata?

pozz

Code:

import java.io.*;

public class ObjectStreamTest {
  public ObjectStreamTest() {
    try {
        int n=0; 
 
        Auto a[]=new Auto[5];
        try {
           ObjectInputStream in = new ObjectInputStream(new FileInputStream("Ost.txt"));

               while(n<5) { a[n] = (Auto)in.readObject(); n++; }
               in.close();
         } catch(Exception ex) {  }
 

      int i;
      for(i=0; i<n; i++)  System.out.println("a[" + i + "]");
      
      Auto ap=new Auto();
      
      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("Ost.txt",true));
      out.writeObject(ap); 
      out.close();

    
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
  
  public static void main(String[] args) {
    new ObjectStreamTest();
  }
}


[Ovu poruku je menjao boris Dj.bl dana 19.07.2008. u 16:03 GMT+1]

[Ovu poruku je menjao boris Dj.bl dana 20.07.2008. u 15:32 GMT+1]
19.07.2008. u 13:20 

boris Dj.bl
Banjaluka

Član broj: 167469
Poruke: 64
79.143.164.*



Profil

icon Re: Dodavanje serijalizovanih objekata u fajl ???20.07.2008. u 14:32
Pa zar bas niko nije upucen u ovo ? !!!
20.07.2008. u 14:32 

Nikola Poša
Beograd

Član broj: 173839
Poruke: 659
*.adsl-3.sezampro.yu.

Sajt: www.nikolaposa.in.rs


Profil

icon Re: Dodavanje serijalizovanih objekata u fajl ???20.07.2008. u 15:48
Sve bi bilo ok da postoji konstruktor klase FileInputStream koji, pored String-a za putanju do fajla, prihvata i neki boolean, kao shto to ima FileOutputStream. Za upisivanje i chitanje iz fajla ja obicho koristim klase BufferedWriter i FileWriter, odnosno BufferedReader i FileReader, a za FileWriter postoji upravo gore pomenuta vrsta konstruktora... Za ovo tvoje stvarno ne bih znao u chemu je problem i shta bi moglo da bude dobro reshenje...
20.07.2008. u 15:48 

boris Dj.bl
Banjaluka

Član broj: 167469
Poruke: 64
79.143.164.*



Profil

icon Re: Dodavanje serijalizovanih objekata u fajl ???20.07.2008. u 17:57
FileOutputStream ima kao sto i vidis u konstruktoru boolean true i on upravu sluzi za dodavanje a sto se tice FileInputStream mislim da njemu ni ne treba boolean.

Evo naprimer kako ovo dodavanje sto sam ja htio radi sa elementarnim podacima.
Uzmimo npr int i koristimo DataInputStream / DataOutputStream.
Kao sto vidis i ovdje ima true samo u FileOutputStream a radi upravo ono sto sam ja htio (svaki put se dodaje broj 5 i ocitava se kako treba)
Kod je ispod

Code:

import java.io.*;

public class ObjectStreamTest1 {
  public ObjectStreamTest1() {
    try {
        int n=0; 
 
        int a[]=new int[5];
        try {
           DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("Ost.txt")));
               while(n<5) { a[n] = in.readInt(); n++; }
               in.close();
         } catch(Exception ex) {  }
 

      int i;
      for(i=0; i<n; i++)  System.out.println("a[" + i + "] = " + a[i]);
      int m=5;
      
      DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("Ost.txt",true)));
      out.writeInt(m);  
      out.close();

    
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
  
  public static void main(String[] args) {
    new ObjectStreamTest1();
  }
}



E sad da bi ovo uradio sa objektima moram koristi ObjectInputStream / ObjectOutputStream.
Uzmimo sad obican int umjesto Auto, posto se javlja isti problem, cisto da pojednostavimo al koristimo ObjectStream.

Tako imamo sledeci kod koji opet iavlja istu gresku kao u prvom postu.
Tako pokretanjem programa vise puta svaki put se dodaje 5.

Code:

import java.io.*;
public class ObjectStreamTest2 {
  
  public static void main(String[] args) throws IOException {
      
          int n=0; 
          int a[]=new int[5];
        try {
           ObjectInputStream in = new ObjectInputStream(new FileInputStream("Ost.txt"));
               while(n<5) { int p = in.readInt(); a[n]=p; n++; }
               in.close();
         } catch(Exception ex) {  }
         
         int i;
         for(i=0; i<n; i++)  System.out.println("a[" + i + "]= " + a[i]);
         
         int m=5;
         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("Ost.txt",true));
         out.writeInt(m); 
         out.close();
  }
}


Ako ovaj program pokrenem tri puta dobiju neki fajl Ost.txt (v2)



Ja sam skontao gdje nastaje greska al ne znam kako je ispraviti ako je uopste moguce.
Da vam lakse pojasnim pogledajte jos jedan mali kod ispod.

Code:

import java.io.*;
public class ObjectStreamTest2 {
  
  public static void main(String[] args) throws IOException {
      
          int n=0; 
          int a[]=new int[5];
        try {
           ObjectInputStream in = new ObjectInputStream(new FileInputStream("Ost.txt"));
               while(n<5) { int p = in.readInt(); a[n]=p; n++; }
               in.close();
         } catch(Exception ex) {  }
         
         int i;
         for(i=0; i<n; i++)  System.out.println("a[" + i + "]= " + a[i]);
         
         int m=5;
         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("Ost.txt",true));
         out.writeInt(m); out.writeInt(m); out.writeInt(m); 
         out.close();
  }
}


Ovo je isto sto i prethodni kod samo se pri jednom pokretanju programa odmah upisuje tri int vrijednosti 5.
Tako dobijem fajl Ost.txt (v3).
E ovaj fajl bi ja trebao dobiti i od programa ObjectStreamTest2 nakon tri pokretanja da bi radilo ispravno.

I kad sam malo analizirao sadrzaj fajlova Ost.txt(v2) i Ost.txt(v3) skontao sam gdje nastaje greska.

Ovo je sadrzaj u bajtovima gdje svaki bajt predstavljen brojem.

Ost.txt(v2)
Citat:
172 237 0 5 119 4 0 0 0 5 172 237 0 5 119 4 0 0 0 5 172 237 0 5 119 4 0 0 0 5 -1


Ost.txt(v3)
Citat:
172 237 0 5 119 12 0 0 0 5 0 0 0 5 0 0 0 5 -1


Moze se vidjeti da greska nastaje pri samom upisivanju objekta.
U Ost.txt(v3) niz 172 237 0 5 119 govori o samoj vrsti objekta, 12 je ukupan broj bajta a svaki objekta ima kod 0 0 0 5 (3 puta u ovom slucaju) i -1 je kraj fajla.
A u Ost.txt(v2) problem je sto se svaki put pored 0 0 0 5 upise i 172 237 0 5 119 4 a to treba upisati samo prvi put.

Tako da bi radilo ispravno trebao bi izbaciti svaki put pri dodavajnu ovih 6 bajtova i pored toga morao bi svaku put 6-i bajt mjenjati 4,8,12,16..

Sad zakljucujem da ovo na ovaj nacin nije moguce, jednostavno je do ove klase.
Al mi je i dalje cudno da ovo nisu implementirali da radi.
20.07.2008. u 17:57 

[es] :: Java :: Dodavanje serijalizovanih objekata u fajl ???

[ Pregleda: 389 | Odgovora: 3 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.